如何高效地根据另一个数组拆分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
相关产品推荐
相关产品推荐

