如何按多条件过滤嵌套数组?附具体场景与代码问题
按多条件过滤嵌套数组的解决方案
需求明确
需要对嵌套数组执行以下过滤规则:
- 条件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);
逻辑说明
- 遍历数组时,为每条记录生成
客户名-产品码的唯一键; - 若该键未在
tracked对象中存在,说明是该客户该产品的第一条记录,保留并标记为已处理; - 若键已存在,说明已保留过同客户同产品的记录,直接过滤当前项。
过滤结果
最终得到符合需求的数组:
[ ["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
相关产品推荐
相关产品推荐

