将空值排序到对象数组中的最后

Abh*_*bhi 5 javascript

我有一个对象数组,如下所示:

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)

我怎样才能实现这个目标?

geo*_*org 7

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

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功能的稳定性。


Nin*_*olz 3

你可以测试一下这个值。如果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)