我正在尝试按升序对对象列表进行排序。但是在某些情况下,排序值为null
,在这种情况下,该值应按字母顺序排序。
我试图创建以下代码:
let items = [
{
name: 'Foo',
Km: null
},
{
name: 'Bar',
Km: 4
},
{
name: 'BarFoo',
Km: null
},
{
name: 'FooBar',
Km: 1
},
]
function sortNullValues(values) {
values.sort(function (a, b) {
if(a.Km === null) return 1
if(b.Km === null) return -1
if (a.Km < b.Km) return 1
if (a.Km < b.Km) return -1
if (a.name > b.name) return -1
if (a.name < b.name) return 1
})
return values
}
console.log(sortNullValues(items))
但是null
值的对象不是按字母顺序排序的。 https://jsfiddle.net/am7n61ou/56/
当前输出:
[
{
name: 'Bar',
Km: 4
},
{
name: 'FooBar',
Km: 1
},
{
name: 'Foo',
Km: null
},
{
name: 'BarFoo',
Km: null
}
]
所需的输出:
[
{
name: 'FooBar',
Km: 1
},
{
name: 'Bar',
Km: 4
},
{
name: 'BarFoo',
Km: null
},
{
name: 'Foo',
Km: null
}
]
答案 0 :(得分:4)
您可以先将Km
的值排到最底,然后按null - null
(var array = [{ name: 'Foo', Km: null }, { name: 'Bar', Km: 4 }, { name: 'BarFoo', Km: null }, { name: 'FooBar', Km: 1 }];
array.sort((a, b) =>
(a.Km === null) - (b.Km === null) ||
a.Km - b.Km ||
a.name.localeCompare(b.name)
);
console.log(array);
为零)或字符串进行排序。
.as-console-wrapper { max-height: 100% !important; top: 0; }
{{1}}
答案 1 :(得分:0)
即使两个值都为null,您的函数也始终返回-1。 我已经修正了您的代码。您应该检查空值并返回不同的排序。
更正的代码:
values.sort(function (a, b) {
if (a.Km === null && b.Km === null) {
if (a.name > b.name) return 1
if (a.name < b.name) return -1
}
if(a.Km === null) return 1
if(b.Km === null) return -1
if (a.Km < b.Km) return 1
if (a.Km < b.Km) return -1
})