【问题标题】:Sort JSON or get JSON in original order [duplicate]对 JSON 进行排序或按原始顺序获取 JSON [重复]
【发布时间】:2020-02-04 16:58:37
【问题描述】:

由于无法获取原始顺序的JSON文件,我想再次在JS中对其进行排序。该文件如下所示:

{
    "index": 5,
    "timestamp": 1570438008,
    "data": {
        "12": [
            "Title 2",
            "Description 2"
        ],
        "10": [
            "Title 1",
            "Description 1"
        ]
    }
}

如果我现在从 JS 访问这个 JSON 文件,我得到的不是原来的订单:

$.ajax({
    url: '../json/smiirl_data.json',
    dataType: 'json',
    success: function(response) {
        console.log(response['data']);
    }
});

来自JS的console.log显示:

{
    "10": [
        "Title 1",
        "Description 1"
    ],
    "12": [
        "Title 2",
        "Description 2"
    ]
}

是否可以对其进行排序(标题降序)?我需要原始订单 (12, 10)。

【问题讨论】:

  • 不保证密钥顺序。如果需要对它们进行排序,请返回 [ id, data ] 对数组。
  • @Mr.Polywhirl 在符合 ES6 的环境中它 但是你不能有相反顺序的数字键。在非 ES6 兼容的环境中,您只是没有保证。所以这是一个双输的局面。与往常一样,建议是,如果您想要有序对象,请使用数组。
  • @VLAZ 你能给我一个我的代码示例吗?
  • @Anuga 我试过这个,但我无法让它工作。你能给我一个我的代码的例子吗:)?
  • 真正的问题是为什么您希望数据的顺序是某种方式?

标签: javascript jquery arrays json sorting


【解决方案1】:

首先您需要将对象序列化为数组,然后使用 sort 函数对其进行排序。

var array = [],
    data = response['data'];

    for (var array in data ) {
         array.push([array, data[vehicle]]);
    }

     array.sort(function(a, b) {
        return b[1] - a[1];
     });

【讨论】:

    【解决方案2】:

    因为对象并不总是保证保持其顺序,并且 JSON 不支持保证顺序的 Map 类,所以您应该使用数组来代替,其中有两个元素:键和值。

    例如:

    "data": [
      [12, ["Title 2", "Description 2"],
      [10, ["Title 1", "Description 1"]
    ]
    

    你可以像这样访问它:

    for(let item of myJSON.data)
    {
      console.log('Key:', item[0]);
      console.log('Value:', item[1]);
    }
    

    【讨论】:

      【解决方案3】:

      为保证顺序,请将数据重新构造为二维数组。

      您可以创建索引映射和查找功能,使数据更易于查询。

      let data = {
        "index": 5,
        "timestamp": 1570438008,
        "data": [
          [ "12", [ "Title 2", "Description 2" ] ],
          [ "10", [ "Title 1", "Description 1" ] ]
        ]
      }
      
      let indexMap = indexLookupMap(data.data); // Build an index
      console.log(lookupEntry(data.data, indexMap, '10')); // Find entry with id '10'
      
      data.data.forEach(entry => {
        console.log(`key => ${entry[0]}, value => ${entry[1].join(', ')}`);
      })
      
      function lookupEntry(data, indexMap, id) {
        return data[indexMap[id]][1];
      }
      
      function indexLookupMap(data) {
        return data.reduce((dict, entry, idx) => Object.assign(dict, { [entry[0]]: idx }), {});
      }
      .as-console-wrapper { top: 0; max-height: 100% !important; }

      【讨论】:

        猜你喜欢
        • 2016-06-05
        • 1970-01-01
        • 2018-12-07
        • 1970-01-01
        • 1970-01-01
        • 2012-12-06
        • 2019-11-22
        • 1970-01-01
        • 2018-02-18
        相关资源
        最近更新 更多