繁体   English   中英

将空值排序为最后在对象数组中

[英]Sort null values to last in Array of Objects

我有一个对象数组如下:

c = [{a: null}, {a: 12}, {a: 1}, {a: 50}, {a: 2}, {a: null}]

我希望通过具有值的对象,然后是具有null的对象来对它们进行排序。

我尝试的是:

c.sort(function(b) { return b.a ? -1 : 1 })

OUTPUT

[{a: 2}, {a: 50}, {a: 1}, {a: 12}, {a: null}, {a: null}]

预期输出

[{a: 12}, {a: 1}, {a: 50}, {a: 2}, {a: null}, {a: null}]

我怎样才能做到这一点?

这会将空值和其他虚假值放在列表的末尾:

 c = [{a: null}, {a: 12}, {a: 1}, {a: 50}, {a: 2}, {a: null}]; c.sort((x, y) => !!ya - !!xa); console.log(c); 

但是,由于您没有真正排序任何内容,您可以将列表拆分为两部分并重新加入它们:

 c = [{a: null}, {a: 12}, {a: 1}, {a: 50}, {a: 2}, {a: null}]; r = [ ...c.filter(x => xa !== null), ...c.filter(x => xa === null) ] console.log(r) 

这也不依赖于sort函数是稳定的。

你可以测试一下这个值。 如果为null ,则采用比较的delta。

 var c = [{ a: null }, { a: 12 }, { a: 1 }, { a: 50 }, { a: 2 }, { a: null }]; c.sort(function (a, b) { return (aa === null) - (ba === null); }); console.log(c); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

对于稳定排序,您可以使用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; } 

那样 ?

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);

编辑

 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); 

 var c = [{ a: null }, { a: 12 }, { a: 1 }, { a: 50 }, { a: 2 }, { a: null }]; c.sort(function(a, b) { return (aa !== 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

尝试return !aa - !ba有效对象先行

 var c = [{a: null}, {a: 12}, {a: 1}, {a: 50}, {a: 2}, {a: null}]; c.sort(function (a, b) { return !aa - !ba }); console.log(c); 

这不完美,但仍然有效,欢呼!

 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); 

以下是如果存在,则在末尾对Date值进行排序的情况:

userSortList = users.sort((a, b) => {
    if (b.lastConnectionDate === null || a.lastConnectionDate) {
        return -1
    } else {
        return (
            new Date(b.lastConnectionDate) - new Date(a.lastConnectionDate)
        )
    }
})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM