typescript - 如何通过键数组对对象进行排序?
问题描述
我有一个键数组,如 ['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 这样的附加数据结构的方法,但我真的想让这个简单。有没有人有一个很好的方法来实现这个?:)
解决方案
你可以很容易地做到这一点,而无需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);
推荐阅读
- gnuplot - 尝试从 2 个数据文件中绘制 3d 形状时,gnuplot“未完全指定先前的参数函数”
- jquery - 设置输入值不会永久更新字段
- spring - Hibernate 中的解码和联合
- r - 分数次幂的负数
- python - 通过在 python 单行中的旧列表的每个值上附加前缀来创建一个新列表
- django - 如何动态地将来自数据库的数据传递给模板(在运行时/实时)
- android - 是否可以从 google play 获取玩家国家信息?
- ruby-on-rails - 如何为归属关系设置我的 Rails 路由?
- node.js - 使用 nvm 时 npm install -g
- python - Python:带有加法运算的条件 switch 语句