我有一个JSON,格式如下:
account = [
{"name":"Los Angeles", "country":"USA"},
{"name":"Boston", "country":"USA"},
{"name":"", "country":"USA"},
{"name":"Chicago", "country":"USA"}
]
我正在尝试最后使用空名称值按名称按字母顺序 A-Z 排序。
我已经尝试过这个,但是,这首先用空值对 A-Z 进行排序。
account.sort( function( a, b ) {
return a.name < b.name ? -1 : a.name > b.name ? 1 : 0;
});
account.sort( function( a, b ) {
if(a.name === "") {
return 1;
} else if(b.name === "") {
return -1;
} else {
return a.name < b.name ? -1 : a.name > b.name ? 1 : 0;
}
});
对于字符串,空字符串被认为是最小的值,因此,被排序为数组中的第一个元素。
但是,我们需要根据要求更改默认行为,因此我们必须为其添加额外的逻辑。
现在在排序中,当我们返回 -1 时,这意味着订单很好并且符合要求。当我们返回 1 时,这意味着订单相反,需要交换,当返回 0 时,两个对象/值相同,不需要执行任何操作。
现在,在我们的例子中,我们需要将空字符串移动到最后一个。因此,如果第一个对象/值是空字符串,则交换它并将其向右移动到数组中。当第二个对象/值为空字符串时,不需要执行任何操作,因为它需要最后。
因此,这就是事情的运作方式。
您需要额外的子句来测试空字符串。
account = [{
"name": "Los Angeles",
"country": "USA"
}, {
"name": "Boston",
"country": "USA"
}, {
"name": "",
"country": "USA"
}, {
"name": "Chicago",
"country": "USA"
}]
account.sort(function(a, b) {
if (b.name.length == 0) {
return -1;
}
if (a.name.length == 0) {
return 1;
}
return a.city.localeCompare(b.city);
});
console.log(account)
不需要额外的ifs。
account = [
{"name":"Los Angeles", "country":"USA"},
{"name":"Boston", "country":"USA"},
{"name":"", "country":"USA"},
{"name":"Chicago", "country":"USA"}
]
account.sort(function(a, b) {
return (a.name || "zzz").localeCompare(b.name || "zzz");
});
document.write("<pre>" + JSON.stringify(account,null,3))
a.name || "zzz"
的意思是"如果 a.name 不是空的,就使用它,否则使用比任何名称都'大'的东西"。