在 JavaScript 中对 JSON 进行排序

Posted

技术标签:

【中文标题】在 JavaScript 中对 JSON 进行排序【英文标题】:Sorting JSON in JavaScript 【发布时间】:2021-12-14 02:32:14 【问题描述】:

我知道之前有人问过类似的问题,我在这里提到了这个问题:sort json object in javascript 但我仍然找不到我的问题的答案。所以我来了。我有一个 JSON 对象结构如下:

 [
  
    "toothNumber": "01",
    "name": "John"
  ,
  
    "toothNumber": "18",
    "name": "John"
  ,
  
    "toothNumber": "19",
    "name": "John"
  ,
  
    "toothNumber": "17",
    "name": "John"
  ,
  
    "toothNumber": "01,32",
    "name": "John"
  ,
  
    "toothNumber": "25,32",
    "name": "John"
  ,
  
    "toothNumber": "",
    "name": "John"
  ,
  
    "toothNumber": "15",
    "name": "John"
  
]

当我使用下面的代码进行排序时,我没有得到预期的结果:

json.sort(function(a, b)
    return a.toothNumber - b.toothNumber;
);

下面是实际结果,不是我预期的结果。任何帮助将不胜感激。

实际结果:

[
  
    "toothNumber": "",
    "name": "John"
  ,
  
    "toothNumber": "01",
    "name": "John"
  ,
  
    "toothNumber": "15",
    "name": "John"
  ,
  
    "toothNumber": "17",
    "name": "John"
  ,
  
    "toothNumber": "18",
    "name": "John"
  ,
  
    "toothNumber": "19",
    "name": "John"
  ,
  
    "toothNumber": "01,32",
    "name": "John"
  ,
  
    "toothNumber": "25,32",
    "name": "John"
  
]

预期结果:

[
    
        "toothNumber": "",
        "name": "John"
    ,
    
        "toothNumber": "01",
        "name": "John"
    ,
    
        "toothNumber": "01,32",
        "name": "John"
    ,
    
        "toothNumber": "15",
        "name": "John"
    ,
    
        "toothNumber": "17",
        "name": "John"
    ,
    
        "toothNumber": "18",
        "name": "John"
    ,
    
        "toothNumber": "19",
        "name": "John"
    ,
    
        "toothNumber": "25,32",
        "name": "John"
    
]

【问题讨论】:

你减去的是字符串而不是数字。先转换成数字。 不确定您希望它如何工作。牙号首先是一个字符串,在某些项目中它是一个多值字符串。比如"25,32" - "18"的结果应该是什么? @jarmod 这些是保存在客户端数据库中的有效值。如果它们都是一个索赔的一部分,他们会保存多个以逗号分隔的牙齿编号。我同意吗,不,但这是我拥有的数据 表示完全没有问题。我只是强调一个事实,即导致 "25,32" - "18" 的实现没有什么意义。 【参考方案1】:

按字符串排序,而不是数字比较。

const json = [      "toothNumber": "01",    "name": "John"  ,      "toothNumber": "18",    "name": "John"  ,      "toothNumber": "19",    "name": "John"  ,      "toothNumber": "17",    "name": "John"  ,      "toothNumber": "01,32",    "name": "John"  ,      "toothNumber": "25,32",    "name": "John"  ,      "toothNumber": "",    "name": "John"  ,      "toothNumber": "15",    "name": "John"  ];

json.sort(function(a, b)
    return a.toothNumber > b.toothNumber ? 1 : (a.toothNumber === b.toothNumber ? 0 : -1 );
);

console.log(json);

【讨论】:

【参考方案2】:

你可以这样做

const json = [      "toothNumber": "01",    "name": "John"  ,      "toothNumber": "18",    "name": "John"  ,      "toothNumber": "19",    "name": "John"  ,      "toothNumber": "17",    "name": "John"  ,      "toothNumber": "01,32",    "name": "John"  ,      "toothNumber": "25,32",    "name": "John"  ,      "toothNumber": "",    "name": "John"  ,      "toothNumber": "15",    "name": "John"  ];

json.sort(function(a, b) 
   return a.toothNumber.split(",")[0] - b.toothNumber.split(",")[0];
);

console.log(json)

【讨论】:

parseInt 是多余的。 @Spectric 是的,当我将其更改为与 sn-p 一起使用时,它被留下了。但无论如何, split 返回字符串数组,所以parseInt 是可取的

以上是关于在 JavaScript 中对 JSON 进行排序的主要内容,如果未能解决你的问题,请参考以下文章

在 Flutter 中对 JSON 列表进行排序 [重复]

在Android中对Json输出进行排序

SwiftUI - 在 SwiftUI 中对显示的 JSON 文件进行排序,分节或排序

如何在 android 中对 JSON 对象键进行排序/排列? [复制]

如何在swift 4中对数组中的JSON数据进行排序

从 JSON 数据中对 UItableview 中的排序和部分进行排序