簡體   English   中英

JavaScript-如何通過數字字符串對數組進行排序?

[英]JavaScript - How to sort an array of array by number strings?

我收到這樣的數組:

[
    [{"name":"one","team":"------","checked":false,"position":"-"},
     {"name":"two","team":"------","checked":false,"position":"1"}],
    [{"name":"three","team":"------","checked":false,"position":"3"},
     {"name":"four","team":"------","checked":false,"position":"7"}]
]

我希望最終輸出是這樣的:

[
    [{"name":"two","team":"------","checked":false,"position":"1"},
     {"name":"four","team":"------","checked":false,"position":"7"}],
    [{"name":"three","team":"------","checked":false,"position":"3"},
     {"name":"one","team":"------","checked":false,"position":"-"}]
]

這意味着該數組按第一子數組中的最大位置值和最小位置值排序,然后按第二子數組中的第二最大位置值和第二最小位置值排序。 如果位置上有“-”,則在字符串編號之后。

到目前為止,我已經用lodash嘗試過:

var mergedArray = vm.roundOf4[0].concat(vm.roundOf4[1]);
var count = _.countBy(mergedArray, {position: '-'});

var ascArray = _.cloneDeep(mergedArray);
var descArray = _.cloneDeep(mergedArray);

_.sortByOrder(ascArray, 'position', 'asc');
_.sortByOrder(descArray, 'position', 'desc');

_.times(count.true, ascArray.push(ascArray.shift()));

vm.roundOf4.some(function (array, i) {
    array.some(function (object, j) {

        if (j === 0) {
            vm.roundOf4[i][j] = ascArray[i];

        } else if (j === 1) {
            vm.roundOf4[i][j] = descArray[i];
        }

    });
});

但是按功能升序排序不能正確地對位置值進行排序,因此它會進行隨機排序。 我不知道是否因為位置是一個字符串值。

我應該改用數字嗎?

 // get an array of object an return the min index or the max index depending on the parameter max (true => max index, false => min index) function minMax(arr, max) { var index = 0; // assuming the index 0 is the min or max for (var i = 1; i < arr.length; i++) { // for each other object in the array if(arr[index].position == '-') // if the position of the object at index index is '-' then assume the index is this i (before starting the comparison, find an item which have a number for its position property) index = i; else if ((arr[i].position > arr[index].position) == max) // now that the object at index index has a valid position property, make the comparison depending on the argument max index = i; } return index; } // take an two dimensional array and rearrange it function reArrange(arr) { var simple = arr.reduce(function(acc, a) { // first let's make the two dimensional array into a one dimensional array return acc.concat(a); }, []); var result = []; // the result array while(simple.length) { // while there is element in the one dimensional array var min = minMax(simple, false); // get the min index var max = minMax(simple, true); // get the max result.push([ // push the items at the min and max indexes as a sub-array of the result array simple.splice(min, 1)[0], // splice to remove it from simple array as well simple.splice((max < min)? max: max - 1, 1)[0] // if max index is after min index then substract one because the above splice shrank the array ]); } return result; } var arr = [ [{"name":"one","team":"------","checked":false,"position":"-"}, {"name":"two","team":"------","checked":false,"position":"1"}], [{"name":"three","team":"------","checked":false,"position":"3"}, {"name":"four","team":"------","checked":false,"position":"7"}] ]; console.log(reArrange(arr)); 

您可以使用對內部數組進行排序,然后分配給結果並再次排序。

 var data = [[{ "name": "one", "team": "------", "checked": false, "position": "-" }, { "name": "two", "team": "------", "checked": false, "position": "1" }], [{ "name": "three", "team": "------", "checked": false, "position": "3" }, { "name": "four", "team": "------", "checked": false, "position": "7" }]], result = []; data.forEach(function (a) { a.sort(function (a, b) { return (+b.position || Number.MIN_VALUE) - (+a.position || Number.MIN_VALUE); }); }); data.forEach(function (a, i) { a.forEach(function (b, j) { result[j] = result[j] || []; result[j][i] = b; }); }); result.forEach(function (a) { a.sort(function (a, b) { return (+a.position || Number.MAX_VALUE) - (+b.position || Number.MAX_VALUE); }); }); console.log(result); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM