javascript - 对象已排序,但未使用 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"
}
]
}
解决方案
以下是步骤:
- 将对象转换为键值对列表(
_.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>