如何使用includes基于指定数组过滤对象数组及处理重复值问题求助
解决方案
1. 正确过滤coins数组(匹配specificCoin)
你之前的写法搞反了判断逻辑:a.name.includes(specificCoin) 是在检查字符串(a.name)是否包含整个数组作为子串,这显然不符合需求。正确的思路是检查specificCoin数组是否包含当前对象的name属性值,用specificCoin.includes(a.name)就能实现。
修正后的代码:
let specificCoin = ["Ethereum","Bitcoin"]; let coins =[ { name: 'Bitcoin' }, { name: 'Ethereum' }, { name: 'Solana' }, { name: 'BinanceCoin' } ]; const filteredCoins = coins.filter(coin => specificCoin.includes(coin.name)); console.log(filteredCoins); // 输出:[{name: 'Bitcoin' }, {name: 'Ethereum' }]
2. 保留过滤结果中的重复对象
其实Array.filter()本身就会保留所有满足条件的元素,哪怕对象的name值重复也不会自动去重。举个例子,如果你的coins数组包含重复对象:
let coins =[ { name: 'Bitcoin' }, { name: 'Ethereum' }, { name: 'Bitcoin' }, // 重复的Bitcoin对象 { name: 'Solana' } ];
用上面的过滤代码后,结果会完整保留两个Bitcoin对象:
// 输出:[{name: 'Bitcoin' }, {name: 'Ethereum' }, {name: 'Bitcoin' }]
所以只要过滤条件正确,重复对象会被自然保留,不需要额外处理。
3. 修复dataAssest与coins的过滤错误
你这段代码出现错误结果,大概率是大小写不匹配或变量名拼写错误导致的:
- 你把
data中的assestSymbol转成了小写,但coin.symbol可能还是大写/混合大小写,导致includes匹配失败; - 注意拼写:
assestSymbol是不是应该是assetSymbol?(疑似多打了一个s)
修正后的代码,确保两边的大小写完全一致:
// 先确认变量名拼写正确,比如assestSymbol → assetSymbol(如果是拼写错误的话) let dataAssest = data.map(item => item.assestSymbol.toLowerCase()); // 将coin.symbol也转成小写后再匹配 let filtered = coins.filter(coin => dataAssest.includes(coin.symbol.toLowerCase()));
如果还是有问题,可以额外排查:
data中的assestSymbol是否确实存在,有没有空值或异常格式;coins中的symbol属性是否正确(你之前的例子用的是name,这里换成了symbol,要确认属性名一致)。
内容的提问来源于stack exchange,提问作者Ram John
相关产品推荐
相关产品推荐

