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

如何按多条件过滤嵌套数组?附具体场景与代码问题

按多条件过滤嵌套数组的解决方案

需求明确

需要对嵌套数组执行以下过滤规则:

  • 条件1:若客户名(数组第2项,testArray[i][1])无重复,直接保留该记录;
  • 条件2:若客户名重复,仅保留该客户下每个产品码(数组第3项,testArray[i][2])的第一条出现记录。

示例数组

let testArray = [
  ["ASDF245", "Jeff Hill", "BOP"],
  ["ASCG285", "Jerry F Tate", "BOP"],
  ["ASDF240", "Jeff Hill", "WC"],
  ["ASDF291", "Jake Sab", "BOP"],
  ["ASDF301", "Mary Stein", "WC"],
  ["ASDF460", "Jeff Hill", "WC"],
  ["ASDF245", "Hello Dup", "BOP"],
  ["ASDF245", "Hello Dup", "BOP"],
  ["ASDF245", "Hello Dup", "WC"]
];

现有代码问题分析

你使用filter时的回调逻辑错误:return iTwo[jTwo]并非有效的布尔判断,filter需要回调返回true/false来决定是否保留元素。即便修正这个问题,嵌套循环的方案效率低且逻辑冗余,易出现遗漏或重复处理的情况。

高效解决方案

使用一个对象跟踪已处理的「客户名+产品码」组合,只需遍历数组一次即可完成过滤,适合处理大型数组:

const tracked = {};
const filteredArray = testArray.filter(item => {
  const clientName = item[1];
  const productCode = item[2];
  // 生成唯一标识,避免同客户同产品重复保留
  const key = `${clientName}-${productCode}`;
  
  if (!tracked[key]) {
    tracked[key] = true;
    return true;
  }
  return false;
});

console.log(filteredArray);

逻辑说明

  1. 遍历数组时,为每条记录生成客户名-产品码的唯一键;
  2. 若该键未在tracked对象中存在,说明是该客户该产品的第一条记录,保留并标记为已处理;
  3. 若键已存在,说明已保留过同客户同产品的记录,直接过滤当前项。

过滤结果

最终得到符合需求的数组:

[
  ["ASDF245", "Jeff Hill", "BOP"],
  ["ASCG285", "Jerry F Tate", "BOP"],
  ["ASDF240", "Jeff Hill", "WC"],
  ["ASDF291", "Jake Sab", "BOP"],
  ["ASDF301", "Mary Stein", "WC"],
  ["ASDF245", "Hello Dup", "BOP"],
  ["ASDF245", "Hello Dup", "WC"]
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 12:58:12