我有一个这样的数组:
[{flag: true, other: 1},
{flag: true, other: 2},
{flag: false, other: 3},
{flag: true, other: 4},
{flag: true, other: 5},
{flag: true, other: 6},
{flag: false, other: 7}]
我想要这个:
[{flag: false, other: 3},
{flag: false, other: 7},
{flag: true, other: 1},
{flag: true, other: 2},
{flag: true, other: 4},
{flag: true, other: 5},
{flag: true, other: 6}]
基本上,我希望如果array[2].flag === false
(或我选择的任何其他值)将匹配的元素放在数组中的第一个,但在前面的匹配元素之后。不匹配的元素将保持原来的顺序。
外观的顺序很重要。
如何在JavaScript中做到最好?
发布于 2011-08-08 00:39:14
这不是真正的排序。您只需在数组中循环两次,然后构建一个新数组:
var result = [];
for (var i = 0; i < arr.length; i++) {
if (arr[i].flag === false) {
result.push(arr[i]);
}
}
for (var i = 0; i < arr.length; i++) {
if (!arr[i].flag === false) {
result.push(arr[i]);
}
}
您还可以使用两个结果数组和一个循环来执行此操作,并连接结果:
var result1 = [], result2 = [];
for (var i = 0; i < arr.length; i++) {
if (arr[i].flag === false) {
result1.push(arr[i]);
} else {
result2.push(arr[i]);
}
}
var result = result1.concat(result2);
发布于 2016-06-01 00:45:35
ECMAScript6引入的Spread syntax (例如,[...object]
)使用数组的reduce
方法使这一点变得相对简单:
const arr = [
{ flag: true, other: 1 },
{ flag: true, other: 2 },
{ flag: false, other: 3 },
{ flag: true, other: 4 },
{ flag: true, other: 5 },
{ flag: true, other: 6 },
{ flag: false, other: 7 }
];
const sortedArr = arr.reduce((acc, element) => {
if (!element.flag) {
return [element, ...acc];
}
return [...acc, element];
}, []);
我发现这个example of extended parameter handling真的很有帮助。
发布于 2011-08-08 00:37:52
编写一个自定义排序函数,并使用标志来增加优先级:
array.sort(function(a,b) {
if (!a['flag'] && b['flag'])
return 1;
if (a['flag'] && !b['flag'])
return -1;
return a['other'] - b['other']
});
基本上,我假设列表中设置了标志的条目优先于没有标志的条目。因此,如果a没有该标志,而b有,则返回1(选择b)。如果a返回,而b没有返回a。
在两者都设置了标志或两者都没有设置的情况下,cmp正常运行。
https://stackoverflow.com/questions/6974069
复制相似问题