【问题标题】:Looking for a way to sort an array of objects in javascript寻找一种在javascript中对对象数组进行排序的方法
【发布时间】:2016-07-03 02:05:44
【问题描述】:

所以我有一个如下所示的 JSON 数组:

[
  {
    row: [
      {
        boat: {
          description: 'Books',
          version: '2',
          id: 6
        },
        airplanes: [
          {
            airplane: [
              {
                description: 'DVD',
                version: 2,
                uid: 69,
                wid: 65,
                id: 84
              }
            ],
            trains: {
              train: [
                {
                  description: 'Pictures',
                  version: 2,
                  id: 149
                }
              ],
              actions: [
                {
                  description: 'This is a really long sentence.',
                  version: 2,
                  tid: 69.01,
                  id: 452
                },
                {
                  description: 'article 2',
                  version: 2,
                  tid: 69.02,
                  id: 453
                },
                {
                  description: 'developer 1',
                  version: 2,
                  tid: 69.03,
                  id: 454
                }
              ]
            }
          },
          {
            airplane: [
              {
                description: 'Games',
                version: 2,
                uid: 65,
                wid: 61,
                id: 80
              }
            ],
            trains: {
              train: [
                {
                  description: 'another great descriptions.',
                  version: 2,
                  id: 145
                }
              ],
              actions: [
                {
                  description: 'being indecisive is good.',
                  version: 2,
                  tid: 65.01,
                  id: 442
                },
                {
                  description: 'couches are comfortable',
                  version: 2,
                  tid: 65.02,
                  id: 443
                }
              ]
            }
          }
        ]
      }
    ]
  }
]

我正在尝试按“wid”以升序对上述输出进行排序,但仍然能够保留整体顺序。例如上面数组元素0的wid是65,数组元素1的wid值是61。因此,元素1和元素0应该交换。有没有内置的 javascript 方法可以像这样对 json 进行排序?

我将有一个比提供的示例大很多的 json 数组输出。

【问题讨论】:

  • 仅供参考,您所拥有的是对象数组,而不是 JSON。 JSON 是指定的数据格式。
  • 没有针对这种特定场景的内置方法。您必须自己编写逻辑。或者lodash 可能有一些可以帮助您的方法。不知道,我没用lodash。
  • 没有内置方法,但您可以在 JavaScript 中设置创建自定义排序函数,并将其用于您要在对象中排序的对象数组(可能是 airplanes 数组) .这是自定义排序的示例:stackoverflow.com/questions/5002848/…

标签: javascript arrays json sorting lodash


【解决方案1】:

Underscore 和 LoDash 都有一个排序方法,可以满足您的需求。在此示例中,我假设您将显示的数据结构存储在名为 data 的变量中。

 _.each(data, function(obj) {
     _.each(obj.row, function(row) {
        // note the reassignment, _.sortBy does not sort in-place
        row.airplanes = _.sortBy(row.airplanes, function(airplane) {
           return airplane.wid; // This will sort ascending. 
                                // To sort descending, simply multiply by -1
        });
     });
 });

那么这是在做什么呢?它获取根数据结构中的每个数组元素并对其进行循环(这是第一个_.each)。然后在每个对象中,循环遍历每个 row 元素并按每个包含的 wid 元素对 row.airplanes 数组进行排序。

希望这对您有所帮助。顺便说一句,您发布的数据是严格无效的 JSON。每个键都应该用双引号引起来,即"row",而不仅仅是row,单引号对于分隔字符串无效,即"DVD"而不是'DVD'。此外,您的 boat 版本是一个字符串,而您的其他版本标识符是整数,最好尝试将您的版本标识符保持为整数。

【讨论】:

  • 出于某种原因,我尝试了您在jsfiddle.net/z50rc770 提出的建议,它没有对返回的结果进行排序(请参阅控制台输出)。我做了一个 console.log(row.airplanes);那不是我应该做的吗?我假设 row.airplanes 会返回正确的输出?还是会自动更新“数据”数组?
  • 我发现了我的问题,我将 lodash.js 和 underscore.js cdns 添加到我的 jsfiddle 中。根据您的回答,我认为我需要两者。在意识到这是其中之一之后。我删除了 underscore.js 并将 _.each 更改为 _.forEach,现在它似乎可以按预期工作。感谢您为我指明正确的方向。
  • @adbarads 已编辑答案以使其更清晰,谢谢
  • @adbarads 此外,许多 lodash 函数都有别名(为 Underscore.js 提供插入式替换功能),因此 _.each 和 _.forEach 是相同的函数。 lodash.com/docs#forEach
【解决方案2】:

我建议使用出色的 jq 命令行 JSON 处理器。由于它是用可移植的 C 编写的,因此速度非常快。易于理解 documentation

cat <file.json> | jq . -S

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-08
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 2012-05-02
    • 2022-06-17
    • 2019-02-23
    • 2021-08-13
    相关资源
    最近更新 更多