如何用reduce或其他方法将对象数组按指定SID拆分两个新数组?
拆分对象数组为匹配/不匹配SID的两个数组
原代码问题分析
你之前的reduce用法逻辑错误:
- 回调参数顺序搞反了,
reduce的正确参数顺序是(累加器, 当前元素),你写反成了(curr, acc) - 遍历的是拆分后的SID字符串数组,但逻辑里错误地试图访问字符串的
SID属性(字符串不存在该属性) - 初始值传入了对象数组,但后续逻辑没有正确利用累加器完成分组
可行解决方案
方法1:使用filter(直观易读)
这种方法代码最容易理解,分别过滤出匹配和不匹配的数组,缺点是会遍历原数组两次:
const obj = [ {"SID": 123, "EMPLOYEE_NAME": "Test123", "EMPLOYEE_ID": 1}, {"SID": 543, "EMPLOYEE_NAME": "Test1543", "EMPLOYEE_ID": 2}, {"SID": 454, "EMPLOYEE_NAME": "Test1454", "EMPLOYEE_ID": 3}, {"SID": 789, "EMPLOYEE_NAME": "Test1789", "EMPLOYEE_ID": 4}, {"SID": 999, "EMPLOYEE_NAME": "Test1999", "EMPLOYEE_ID": 5}, {"SID": 555, "EMPLOYEE_NAME": "Test1555", "EMPLOYEE_ID": 6}, ]; const sidNumbers = "789,543,123"; // 转成Set提升查询效率(O(1)查询) const sidSet = new Set(sidNumbers.split(',').map(Number)); // 匹配SID的数组 const firstArray = obj.filter(item => sidSet.has(item.SID)); // 不匹配SID的数组 const secondArray = obj.filter(item => !sidSet.has(item.SID)); console.log(firstArray); console.log(secondArray);
方法2:使用reduce(一次遍历,性能更优)
如果处理的数组数据量极大,用reduce只遍历一次原数组就能生成两个结果数组,减少性能开销:
const obj = [ {"SID": 123, "EMPLOYEE_NAME": "Test123", "EMPLOYEE_ID": 1}, {"SID": 543, "EMPLOYEE_NAME": "Test1543", "EMPLOYEE_ID": 2}, {"SID": 454, "EMPLOYEE_NAME": "Test1454", "EMPLOYEE_ID": 3}, {"SID": 789, "EMPLOYEE_NAME": "Test1789", "EMPLOYEE_ID": 4}, {"SID": 999, "EMPLOYEE_NAME": "Test1999", "EMPLOYEE_ID": 5}, {"SID": 555, "EMPLOYEE_NAME": "Test1555", "EMPLOYEE_ID": 6}, ]; const sidNumbers = "789,543,123"; const sidSet = new Set(sidNumbers.split(',').map(Number)); // 一次遍历完成分组 const result = obj.reduce((acc, item) => { if (sidSet.has(item.SID)) { acc.matched.push(item); } else { acc.unmatched.push(item); } return acc; }, { matched: [], unmatched: [] }); const firstArray = result.matched; const secondArray = result.unmatched; console.log(firstArray); console.log(secondArray);
关于reduce是否是最优解?
- 若追求最少遍历次数,
reduce是优质选择,仅需一次遍历即可得到两个结果数组 - 若追求代码可读性,
filter更直观,适合绝大多数日常开发场景(只有数据量极大时,两次遍历的性能差异才会显现) - 无论用哪种方法,都建议将SID字符串转为
Set,因为Set.has()的查询效率是O(1),远高于数组includes()的O(n)
内容的提问来源于stack exchange,提问作者devReact
相关产品推荐
相关产品推荐

