基于cod和art属性去除对象数组重复项:函数结果异常求助
问题排查与解决
我来帮你拆解这个问题的根源,以及给出修复方案~
问题核心原因
你的过滤逻辑里,用来判断重复的键生成方式完全错误:
你用了el.cod && el.art作为哈希对象的键,但这是逻辑与运算,不是把两个值组合成唯一标识:
- 当
el.cod是真值(比如1.13、1.14这类数字),el.cod && el.art的结果直接等于el.art的值 - 所以
{cod:1.13, art:'BCC'}和{cod:1.14, art:'BCC'}的键都会变成'BCC',后者会被误判为重复项过滤掉,这就是你只得到2条数据的原因
修正后的代码
我们需要把cod和art组合成一个唯一的字符串键,比如用模板字符串${el.cod}-${el.art},这样不同的cod+art组合会生成不同的键。修改后的代码如下:
data = [ { cod: 1.13, art: 'BCC' }, { cod: 1.13, art: 'BCC' }, { cod: 1.13, art: 'BCC' }, { cod: 1.14, art: 'BCC' }, { cod: 1.14, art: 'BCC' }, { cod: 1.13, art: 'AAA' }, { cod: 1.13, art: 'AAA' } ]; ngOnInit() { var filtered = this.data.filter(function(el) { // 生成唯一的组合键 const uniqueKey = `${el.cod}-${el.art}`; if (!this[uniqueKey]) { this[uniqueKey] = true; return true; } return false; }, Object.create(null)); console.log(filtered); }
验证结果
运行这段代码后,filtered会完美匹配你的预期输出:
[ { cod: 1.13, art: 'BCC' }, { cod: 1.14, art: 'BCC' }, { cod: 1.13, art: 'AAA' } ]
额外小提示
如果你的cod是计算生成的浮点数(可能存在精度差异),可以考虑固定小数位数后再组合键,避免因为精度问题导致的误判,比如:
const uniqueKey = `${el.cod.toFixed(2)}-${el.art}`;
内容的提问来源于stack exchange,提问作者John w.
相关产品推荐
相关产品推荐

