2017-02-22 79 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; }

相关问题