如何通过ID数组过滤包含对象的JavaScript数组?
搞定数组过滤匹配的问题
嘿,我来帮你把这个过滤逻辑补全!你已经找对了方向——Array.filter()的第二个参数会作为回调函数里的this上下文,所以你完全可以用this来指代array2。不过有两个细节得注意,尤其是你提到array2里是字符串类型的ID值,这和array1里数字类型的id得做类型匹配才行。
基础实现(兼容旧环境)
用indexOf来判断元素是否存在,记得把array1里的数字id转成字符串,避免类型不匹配导致判断错误:
var filtered = array1.filter(function(e) { // 把数字id转成字符串,再检查是否在array2中 return this.indexOf(String(e.id)) !== -1; }, array2);
indexOf返回-1就代表没找到,所以我们判断不等于-1时就保留当前对象。
更简洁的写法(ES6+支持)
如果你的环境支持ES6及以上,用includes会更语义化,直接返回布尔值:
var filtered = array1.filter(function(e) { return this.includes(String(e.id)); }, array2);
性能优化(适合大数据量)
要是array2里的元素特别多,上面两种方法每次查找都是O(n)的时间复杂度,不如先把array2转成Set,这样查找速度会快很多(O(1)复杂度):
// 先把array2转成Set集合 var idSet = new Set(array2); var filtered = array1.filter(function(e) { return idSet.has(String(e.id)); });
这种方式不用依赖filter的第二个参数,直接用外部的idSet就行,代码也更清晰。
小补充
如果你的array2其实是数字类型(和你给的示例一样),那直接去掉String()转换,判断this.includes(e.id)就可以啦~回调里的e就是array1里的每一个对象,e.id就是你要匹配的属性值,很好理解的。
内容的提问来源于stack exchange,提问作者Rasim Avcı
相关产品推荐
相关产品推荐

