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

如何高效地根据另一个数组拆分JavaScript对象数组?

如何高效根据指定数组拆分对象数组?

给定如下对象数组和普通数组:

const arrayObj = [
    {
        id: 1,
        name: "user1",
    },
    {
        id: 2,
        name: "user2",
    },
    {
        id: 3,
        name: "user3",
    },
]

const array = ["user1", "user2"]

需要将arrayObj拆分为两个数组:

const array1 = [
    {
        id: 1,
        name: "user1",
    },
    {
        id: 2,
        name: "user2",
    },
]

const array2 = [
    {
        id: 3,
        name: "user3",
    },
]

我原本的实现代码如下:

const filteredArray = arrayObj.filter((el) => {
  return array.some((f) => {
    return f === el.name;
  });
});

但这种方式效率不够高,有没有更快速的实现方法?


更高效的实现方案

你原来的代码里,filter遍历arrayObj每个元素时,都要调用array.some遍历整个array,时间复杂度是O(m*n)(m是arrayObj的长度,n是array的长度),数组规模大的时候性能会明显下滑。

优化核心是把array转成Set,利用Set的has方法O(1)的查询效率,把整体时间复杂度降到O(m+n):

方式1:普通for循环(性能最优)

// 先把目标名称集合转成Set
const nameSet = new Set(array);
const array1 = [];
const array2 = [];

for (const item of arrayObj) {
  if (nameSet.has(item.name)) {
    array1.push(item);
  } else {
    array2.push(item);
  }
}

方式2:reduce函数式写法(代码更简洁)

const nameSet = new Set(array);
const { array1, array2 } = arrayObj.reduce((acc, item) => {
  acc[nameSet.has(item.name) ? 'array1' : 'array2'].push(item);
  return acc;
}, { array1: [], array2: [] });

这两种方式都只需要遍历arrayObj一次,Set的构建也只需要遍历array一次,比嵌套遍历高效得多,特别适合处理大规模数据。

内容的提问来源于stack exchange,提问作者Owenn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 13:46:30