You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按指定数组元素顺序获取匹配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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 09:55:31