JavaScript中数组不等匹配过滤失效问题求助
问题分析与解决方案:筛选数组A中未匹配数组B id1的对象
你的问题出在逻辑判断的方向上!咱们来拆解一下你写的代码:
var output = A.filter(x => B.some(y => x.id !== y.id1));
some()方法的作用是只要数组里有一个元素满足条件就返回true。也就是说,对于数组A里的每一个对象x,只要数组B里存在任意一个y的id1不等于x的id,这个x就会被保留下来。而数组B里肯定有至少一个元素的id1和x的id不一样,所以最终会返回整个数组A,这完全不是你想要的结果。
正确的实现方式有两种,按需选择:
方法1:用every()替代some()
我们需要判断的是:数组B里的所有元素的id1都不等于x的id,这时候就该用every()方法(它要求数组里所有元素都满足条件才返回true):
var A = [ { "id": "xyz", "number": "123", "place": "Here", "phone": "9090909090" }, { "id": "abc", "number": "456", "place": "There", "phone": "9191919191" } ]; var B = [ { "element1" : "ert", "id1":"iii", "element2":"erws", "element3":"234" }, { "element1" : "uio", "id1":"xyz", "element2":"puy", "element3":"090" } ]; var output = A.filter(x => B.every(y => x.id !== y.id1)); console.log(output); // 输出:[{ "id": "abc", "number": "456", "place": "There", "phone": "9191919191" }]
方法2:先提取B的id1到Set,再筛选(性能更优)
如果数组B的长度很大,上面的方法会有O(n*m)的时间复杂度。我们可以先把B里所有的id1提取出来存到一个Set里,这样判断是否存在的时间复杂度就变成O(1)了:
var bIds = new Set(B.map(y => y.id1)); var output = A.filter(x => !bIds.has(x.id)); console.log(output); // 同样得到你期望的结果
这两种方法都能正确筛选出数组A中id在数组B的id1里完全找不到匹配的对象,完美符合你的需求~
内容的提问来源于stack exchange,提问作者Virat
相关产品推荐
相关产品推荐

