我有一个对象数组如下:
c = [{a: null}, {a: 12}, {a: 1}, {a: 50}, {a: 2}, {a: null}]
我想通过具有值的对象对它们进行排序,然后是具有null的对象。
我尝试的是:
c.sort(function(b) { return b.a ? -1 : 1 })
输出
[{a: 2}, {a: 50}, {a: 1}, {a: 12}, {a: null}, {a: null}]
预期输出
[{a: 12}, {a: 1}, {a: 50}, {a: 2}, {a: null}, {a: null}]
我怎样才能做到这一点?
答案 0 :(得分:2)
这会将空值和其他有价值的值放在列表的末尾:
c = [{a: null}, {a: 12}, {a: 1}, {a: 50}, {a: 2}, {a: null}];
c.sort((x, y) => !!y.a - !!x.a);
console.log(c);

但是,既然你没有真正排序任何东西,你可以将列表分成两部分重新加入:
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)

这也不依赖于sort
函数的稳定性。
答案 1 :(得分:2)
您可以测试该值。如果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);
.as-console-wrapper { max-height: 100% !important; top: 0; }
对于稳定排序,您可以使用sorting with map并使用索引作为第二种排序选项。
// 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);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 2 :(得分:1)
c=[{a: null}, {a: 12}, {a: 1}, {a: 50}, {a: 2}, {a: null}];
c.sort(function(a,b){ return a.a===null ? 1:-1 })
console.log(c);
被修改
答案 3 :(得分:1)
const c = [{a: null}, {a: 12}, {a: 1}, {a: 50}, {a: 2}, {a: null}];
let result = [...c.filter(_=>_["a"]!==null),...c.filter(_=>_["a"]===null)];
console.log(result);
答案 4 :(得分:1)
var c = [{
a: null
}, {
a: 12
}, {
a: 1
}, {
a: 50
}, {
a: 2
}, {
a: null
}];
c.sort(function(a, b) {
return (a.a !== null) ? 0 : 1;
});
console.log(c);
在sort函数中返回0
将保持订单不变。
如果compareFunction(a,b)返回0,则保持a和b相对于彼此保持不变,但是对所有不同的元素进行排序。
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
答案 5 :(得分:1)
尝试使用return !a.a - !b.a
。有效对象先行
var c = [{a: null}, {a: 12}, {a: 1}, {a: 50}, {a: 2}, {a: null}];
c.sort(function (a, b) {
return !a.a - !b.a
});
console.log(c);
答案 6 :(得分:0)
这不完美,但仍然有效,欢呼!
var c = [{a: null}, {a: 12}, {a: 1}, {a: 50}, {a: 2}, {a: null}]
c.sort(function(object1,object2){
if(object1.a === null && object2.a !== null){return 1}
if([object1.a,object2.a].every((a)=>a === null) ||
[object1.a,object2.a].every((a)=>a !== null)
){return 0}
if(object1.a !== null && object2.a === null){return -1}
})
console.log(c);

答案 7 :(得分:0)
在这种情况下,如果存在的话,将Date排序为空(null):
userSortList = users.sort((a, b) => {
if (b.lastConnectionDate === null || a.lastConnectionDate) {
return -1
} else {
return (
new Date(b.lastConnectionDate) - new Date(a.lastConnectionDate)
)
}
})