按字母顺序排序JSON(最后为空值)

时间:2015-06-16 15:48:20

标签: javascript json sorting

我有一个JSON,格式如下:

account = [
     {"name":"Los Angeles", "country":"USA"},
     {"name":"Boston", "country":"USA"},
     {"name":"", "country":"USA"},
     {"name":"Chicago", "country":"USA"}
]

我试图按字母顺序对A-Z BY NAME进行排序,最后用空名称值。

我试过这个,但是,这首先用空值对A-Z进行排序。

account.sort( function( a, b ) {
    return a.name < b.name ? -1 : a.name > b.name ? 1 : 0;
});

3 个答案:

答案 0 :(得分:5)

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时,两个对象/值都相同,不需要任何操作。

现在,在我们的例子中,我们需要将空字符串移动到最后一个。因此,如果第一个对象/值是空字符串,则交换它并将其向右移动到数组中。当第二个对象/值为空字符串时,不需要任何操作,因为它必须是最后的。

因此,这就是事情的运作方式。

答案 1 :(得分:4)

您需要额外的子句来测试空字符串。

&#13;
&#13;
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)
&#13;
&#13;
&#13;

答案 2 :(得分:3)

无需额外的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不为空,请使用它,否则使用比任何名称'更大'的东西。”