首页 > 解决方案 > 对象已排序,但未使用 lodash sortBy 保留其键

问题描述

语境

需要readingDate使用 lodash 对以下对象进行排序,我可以对其进行排序,但它的索引没有保留。

原始 JSON 对象

{
    "Inventory Creation": [
      {
        "id": 150,
        "reading": "12345",
        "readingDate": "2020-07-14"
      }
    ],
    "Inventory & Check-in": [
      {
        "id": 151,
        "reading": "12345",
        "readingDate": "2020-11-14"
      }
    ],
    "Check-in": [
      {
        "id": 152,
        "reading": "12345",
        "readingDate": "2020-08-14"
      }
    ]
}

我试过的代码

_.sortBy(unsorted, o => o[0].readingDate).reverse();

这里unsorted包含上面的原始 JSON 对象

实际结果(我得到的)

{
    0: [
      {
        "id": 151,
        "reading": "12345",
        "readingDate": "2020-11-14"
      }
    ],
    1: [
      {
        "id": 152,
        "reading": "12345",
        "readingDate": "2020-08-14"
      }
    ],
    2: [
      {
        "id": 150,
        "reading": "12345",
        "readingDate": "2020-07-14"
      }
    ]
}

预期结果(我想要的)

{
    "Inventory & Check-in": [
      {
        "id": 151,
        "reading": "12345",
        "readingDate": "2020-11-14"
      }
    ],
    "Check-in": [
      {
        "id": 152,
        "reading": "12345",
        "readingDate": "2020-08-14"
      }
    ],
    "Inventory Creation": [
      {
        "id": 150,
        "reading": "12345",
        "readingDate": "2020-07-14"
      }
    ]
}

标签: javascriptarrayslodash

解决方案


以下是步骤:

  • 将对象转换为键值对列表(_.toPairs()或内置的Object.entries()
  • 排序列表
  • 将键值对列表转换回对象(_.fromPairs()或内置的Object.fromEntries()

下面的片段可以帮助你。我使用_.chain()以获得更好的可读性

const data = {
  "Inventory Creation": [
    {
      id: 150,
      reading: "12345",
      readingDate: "2020-07-14",
    },
  ],
  "Inventory & Check-in": [
    {
      id: 151,
      reading: "12345",
      readingDate: "2020-11-14",
    },
  ],
  "Check-in": [
    {
      id: 152,
      reading: "12345",
      readingDate: "2020-08-14",
    },
  ],
}

const res = _.chain(data)
  .toPairs()
  .sortBy((p) => p[1][0].readingDate)
  .reverse()
  .fromPairs()
  .value()

console.log(res)
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.19/lodash.min.js"></script>


推荐阅读