【发布时间】:2017-07-13 04:15:15
【问题描述】:
我收到一个这样的数组:
[
[{"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是一个字符串值。
我应该改用数字吗?
【问题讨论】:
-
1和-在同一个子数组中,但在您想要的输出中它们是分开的。这背后的逻辑是什么? -
没有逻辑,只是“-”还没有设置。它可以是另一个数字,但因为它尚未设置,所以它留在最后,这同样适用于任何对象。
-
不说
-,我说的是1和-在排序之后是如何分开的! (之前:他们在同一个子数组中,之后:每个人都去了不同的子数组)!7和3相同! -
和
1、7、3和-在我看来别有一番风味! -
@ibrahimmahrir 该数组按第一个数组中的最大位置值和最小位置值排序,然后是第二个数组中的第二大位置值和第二最小位置值。带“-”的位置在字符串数字之后。
标签: javascript arrays json sorting lodash