按特定元素字母顺序排序JSON

15

我有一些格式为 JSON 的内容:

places =[
     {
      "city":"Los Angeles",
      "country":"USA",
     },
     {
      "city":"Boston",
      "country":"USA",
     },
     {
      "city":"Chicago",
      "country":"USA",
     },
] 

等等……

我正在尝试按城市的字母顺序进行排序,但是遇到了一些问题。我相信我的问题根源似乎在于确定字符(而不是数字)的顺序。 我已经尝试过一个简单的方法:

    places.sort(function(a,b) {
     return(a.city) - (b.customInfo.city);
    });

然而,这个减法不知道该怎么办。有人能帮我解决吗?

3个回答

43

可惜的是,在JavaScript中没有通用的“比较”函数来返回sort()适当的值。我会编写一个compareStrings函数,该函数使用比较运算符,然后在sort函数中使用它。

function compareStrings(a, b) {
  // Assuming you want case-insensitive comparison
  a = a.toLowerCase();
  b = b.toLowerCase();

  return (a < b) ? -1 : (a > b) ? 1 : 0;
}

places.sort(function(a, b) {
  return compareStrings(a.city, b.city);
})

天啊,Matti,我欠你一瓶啤酒。为什么a<b的比较有效?它是否知道检查字符顺序? - Alex Neigher
4
比较运算可行是因为<及其类似符号在字符串比较中使用字典序。内部会逐个检查匹配的字符,当它发现两个不同的Unicode值时就返回,这样就实现了“字典”排序。我还加入了toLowerCase()函数调用作为附加措施,因为比较本身只比较码点值,并不检查大小写。 - Matti Virkkunen

16

Matti的解决方案是正确的,但您可以更简单地编写它。您不需要额外的函数调用;您可以直接将逻辑放置在sort回调中。

对于不区分大小写的排序:

places.sort( function( a, b ) {
    a = a.city.toLowerCase();
    b = b.city.toLowerCase();

    return a < b ? -1 : a > b ? 1 : 0;
});

对于区分大小写的排序:

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

https://ourcodeworld.com/articles/read/764/how-to-sort-alphabetically-an-array-of-objects-by-key-in-javascript 这个对我有用。 - vinny

1
在排序城市的背景下,特别是当我们从API或其他源获取城市时,不会出现重复的城市名称,我们可以简化排序函数以提高可读性。
places.sort(function (a, b) {
     return a.city < b.city ? -1 : 1;
});

在这里,我们基本上是这样说的:如果 a.city 在字母顺序上位于 b.city 之前,那么在排序数组中将 a 放在 b 之前。否则,将 b 放在 a 之前。 即使在存在重复城市名称的情况下,这个函数仍然可以正常工作

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接