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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 13:35:22