如何从字符串数组中筛选出对象数组未包含的字符串?
解决字符串数组与对象数组的筛选问题
嘿,我明白你想实现的功能——从strings数组里挑出那些没在objects数组的name字段中出现过的字符串对吧?你的思路方向是对的,但代码里有个关键的小错误导致结果不符合预期。
原代码的问题
你用了objects.includes(o2=> o2.name === o1),但Array.includes()方法的作用是判断数组中是否直接包含某个具体值,它并不支持传入回调函数做条件判断。这行代码相当于在问“objects数组里有没有这个回调函数?”,显然答案是没有,所以!includes(...)永远为true,最后filter会返回整个strings数组。
正确的实现方式
这里有两种靠谱的解法,你可以根据数据量来选:
方法1:用Array.some()做条件判断
some()方法会遍历数组,只要有一个元素满足回调里的条件就返回true。我们要找的是“没有任何对象的name等于当前字符串”,所以取反即可:
var objects = [{name:'a',is:false},{name:'b',is:false},{name:'c',is:false}]; var strings = ['a','b','z','x']; let result = strings.filter(str => !objects.some(obj => obj.name === str)); console.log(result); // 输出: ['z', 'x']
方法2:用Set优化性能(适合大数据量)
如果你的objects数组元素很多,每次用some()遍历会比较耗时。可以先把所有已存在的name提取到Set中,利用Set的O(1)查找效率来优化:
var objects = [{name:'a',is:false},{name:'b',is:false},{name:'c',is:false}]; var strings = ['a','b','z','x']; // 先收集所有已存在的name const existingNames = new Set(objects.map(obj => obj.name)); // 筛选不在集合中的字符串 let result = strings.filter(str => !existingNames.has(str)); console.log(result); // 输出: ['z', 'x']
这两种方法都能得到你想要的['z', 'x']结果,第二种在数据量大的时候性能优势会更明显哦。
内容的提问来源于stack exchange,提问作者Shaswata
相关产品推荐
相关产品推荐

