我有一个对象数组,如下所示:
c = [{a: null}, {a: 12}, {a: 1}, {a: 50}, {a: 2}, {a: null}]
Run Code Online (Sandbox Code Playgroud)
我想按首先具有值的对象然后是具有 null 的对象对它们进行排序。
我尝试的是:
c.sort(function(b) { return b.a ? -1 : 1 })
Run Code Online (Sandbox Code Playgroud)
输出
[{a: 2}, {a: 50}, {a: 1}, {a: 12}, {a: null}, {a: null}]
Run Code Online (Sandbox Code Playgroud)
预期产出
[{a: 12}, {a: 1}, {a: 50}, {a: 2}, {a: null}, {a: null}]
Run Code Online (Sandbox Code Playgroud)
我怎样才能实现这个目标?
这会将空值和其他错误值放在列表的末尾:
c = [{a: null}, {a: 12}, {a: 1}, {a: 50}, {a: 2}, {a: null}];
c.sort((x, y) => !!y.a - !!x.a);
console.log(c);Run Code Online (Sandbox Code Playgroud)
但是,由于您没有真正对任何内容进行排序,因此您可以将列表分成两部分然后重新加入它们:
c = [{a: null}, {a: 12}, {a: 1}, {a: 50}, {a: 2}, {a: null}];
r = [
...c.filter(x => x.a !== null),
...c.filter(x => x.a === null)
]
console.log(r)Run Code Online (Sandbox Code Playgroud)
这也不依赖于sort功能的稳定性。
你可以测试一下这个值。如果null,则取比较的增量。
var c = [{ a: null }, { a: 12 }, { a: 1 }, { a: 50 }, { a: 2 }, { a: null }];
c.sort(function (a, b) {
return (a.a === null) - (b.a === null);
});
console.log(c);Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }Run Code Online (Sandbox Code Playgroud)
为了获得稳定的排序,您可以使用映射排序并使用索引作为第二个排序选项。
// the array to be sorted
var list = [{ a: null }, { a: 12 }, { a: 1 }, { a: 50 }, { a: 2 }, { a: null }];
// temporary array holds objects with position and sort-value
var mapped = list.map(function(el, i) {
return { index: i, value: el.a === null};
});
// sorting the mapped array containing the reduced values
mapped.sort(function(a, b) {
return a.value - b.value || a.index - b.index;
});
// container for the resulting order
var result = mapped.map(function(el){
return list[el.index];
});
console.log(result);Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }Run Code Online (Sandbox Code Playgroud)