我收到这样的数组:
[
[{"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是一个字符串值。
我应该使用数字吗?
答案 0 :(得分: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));
&#13;
答案 1 :(得分: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);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;