2017-02-22 92 views
0

我接收陣列是這樣的:JavaScript - 如何通過數字字符串對數組進行排序?

[ 
    [{"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]; 
     } 

    }); 
}); 

但按功能分類的升序排序是不正確的排序位置值,所以它給隨機排序。我不知道這是因爲position是一個字符串值。

我應該用數字來代替嗎?

+2

'1'和'-'是相同的子陣列,但在你需要的輸出他們分開。這背後的邏輯是什麼? –

+0

沒有邏輯,只是「 - 」還沒有設置。它可以是另一個數字,但是因爲它尚未設置,所以它被留在最後,這同樣適用於任何對象。 – forkfork

+1

不是在談論'-',我正在談論'1'和'-'是如何在排序後相互分離的! (**之前:**他們在同一個子陣列中,**之後:**每個人都去了一個不同的子陣列)! '7'和'3'也一樣! –

回答

0

// 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));

0

你可以使用某種內部數組,然後分配到結果和排序一次。

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; }

相關問題