JavaScript:如何基于查找对象对映射后的数组进行排序?
根据查找对象的position属性排序数组
你可以直接利用数组的sort方法,结合查找对象里的position属性来实现排序,不需要多余的map步骤(当然如果有特殊需求也可以用map辅助),以下是两种可行方案:
方案一:直接排序(高效简洁)
这种方法直接对原数组的元素进行比较,利用查找对象的position值来决定顺序:
const obj = { "email": {position: 1, name: "email"}, "firstname": {position: 2, name: "firstname"}, "lastname": {position: 3, name: "lastname"} } const arr = ["lastname", "email", "firstname"]; // 先复制数组避免修改原数组,再排序 const sortedArr = [...arr].sort((a, b) => obj[a].position - obj[b].position); console.log(sortedArr); // 输出: ["email", "firstname", "lastname"]
逻辑说明:
sort方法的比较函数接收两个元素a和b,通过obj[a].position - obj[b].position的结果来决定顺序:- 结果为负数:
a的position更小,排在b前面 - 结果为正数:
b的position更小,排在a前面 - 结果为0:顺序不变
- 结果为负数:
- 使用
[...arr]或者arr.slice()复制数组,是因为sort是原地排序,会修改原数组;如果不需要保留原数组,也可以直接用arr.sort(...)。
方案二:结合map辅助排序
如果需要先把元素转换成包含position的对象再处理,可以用这种方式:
const obj = { "email": {position: 1, name: "email"}, "firstname": {position: 2, name: "firstname"}, "lastname": {position: 3, name: "lastname"} } const arr = ["lastname", "email", "firstname"]; const sortedArr = arr // 第一步:把每个元素转换成包含原元素和position的对象 .map(item => ({ value: item, position: obj[item].position })) // 第二步:根据position排序 .sort((x, y) => x.position - y.position) // 第三步:提取原元素得到最终数组 .map(item => item.value); console.log(sortedArr); // 输出: ["email", "firstname", "lastname"]
逻辑说明:
- 第一个
map把数组中的每个字符串,转换成包含原字符串和对应position的对象; - 用
sort根据position属性排序; - 第二个
map把原字符串提取出来,得到目标数组。
这种方法适合需要在排序前后对元素做额外处理的场景,但相比方案一多了两次map操作,性能略低。
内容的提问来源于stack exchange,提问作者Younes
相关产品推荐
相关产品推荐

