如何按指定数组元素顺序获取匹配order字段的对象数组?
问题:按指定数组顺序筛选并排序对象数组
现有两个数据:
let items = [5, 1, 3, 4, 2];
对象数组:
let objectItem = [ {id:"item-1", name: "Total revenue",selected:true, order: 1}, {id:"item-2", name: "Total tax",selected:true, order: 2}, {id:"item-3", name: "Sales Report",selected:false, order: 3}, {id:"item-4", name: "Total parking",selected:false, order: 4}, {id:"item-5", name: "Sales maximum",selected:false, order: 5}, {id:"item-6", name: "Amount Collected",selected:true, order: 6}, {id:"item-7", name: "Total fall",selected:false, order: 7} ];
需求:获取objectItem中order字段与items数组元素匹配的对象,且结果数组的顺序必须和items数组的元素顺序完全一致,期望结果如下:
[ {id:"item-5", name: "Sales maximum",selected:false, order: 5}, {id:"item-1", name: "Total revenue",selected:true, order: 1}, {id:"item-3", name: "Sales Report",selected:false, order: 3}, {id:"item-4", name: "Total parking",selected:false, order: 4}, {id:"item-2", name: "Total tax",selected:true, order: 2}, ]
目前使用filter方法筛选,得到的结果是按原objectItem的顺序(即order升序)排列,不符合需求:
const itemArr = objectItem.filter((itm) => { return items.indexOf(itm.order) > -1; });
请问如何修改代码,得到与items数组顺序完全一致的结果数组?
解决方案
方法:利用映射表+遍历指定数组
filter方法只能保留符合条件的元素,但顺序是原数组的顺序,无法匹配items的顺序。我们可以先把objectItem转换成以order为键的映射表,再遍历items数组取出对应的对象,这样就能保证顺序完全一致。
代码实现:
// 1. 将objectItem转换为以order为键的Map,快速查找对象 const orderToItemMap = new Map(objectItem.map(item => [item.order, item])); // 2. 遍历items数组,按顺序取出对应的对象 const result = items.map(order => orderToItemMap.get(order));
补充:处理可能的无效order
如果items中存在objectItem里没有的order值,可以在最后加一层过滤,移除undefined:
const result = items.map(order => orderToItemMap.get(order)).filter(Boolean);
为什么这个方法更优?
- 时间复杂度为O(n),比先
filter再排序的O(n log n)效率更高,适合数据量大的场景; - 逻辑清晰,直接按目标顺序构建结果数组,避免排序逻辑的额外开销。
内容的提问来源于stack exchange,提问作者bugsmasher
相关产品推荐
相关产品推荐

