首页 > 解决方案 > 如何通过键数组对对象进行排序?

问题描述

我有一个键数组,如 ['D', 'B', 'A', 'C'] 和如下所示的对象。

obj = [
    {key: 'C', value: 'CCC'},
    {key: 'B', value: 'BBB'},
    {key: 'D', value: 'DDD'},
    {key: 'A', value: 'AAA'}
]

将该 obj 排序为如下键顺序的最佳方法是什么,我更喜欢使用 Lodash。

sorted_obj = [
    {key: 'D', value: 'DDD'},
    {key: 'B', value: 'BBB'},
    {key: 'A', value: 'AAA'},
    {key: 'C', value: 'CCC'}
]

我可以想到使用像 Map 这样的附加数据结构的方法,但我真的想让这个简单。有没有人有一个很好的方法来实现这个?:)

标签: typescriptsorting

解决方案


你可以很容易地做到这一点,而无需lodash.

诀窍是准备一个键映射到排序数组中的位置(对于给定的输入,它是{D: 0, B: 1, A: 2, C: 3})。您可以使用Array.sort()具有自定义比较功能的功能,然后:

const sorted = ['D', 'B', 'A', 'C'];
const obj = [
    {key: 'C', value: 'CCC'},
    {key: 'B', value: 'BBB'},
    {key: 'D', value: 'DDD'},
    {key: 'A', value: 'AAA'}
];

const sortedMap = sorted.reduce((acc, v, idx) => ({...acc, [v]: idx}), {});
const result = obj.sort((a, b) => sortedMap[a.key] - sortedMap[b.key]);

console.log(result);


推荐阅读