如何判断对象中子数组是否包含指定数组?过滤对象数组遇阻求助
解决数组过滤匹配的问题
嘿,我懂你碰到的麻烦了!你现在的问题核心是没搞对includes()方法的用法,还有过滤逻辑的方向错了~
问题出在哪?
你写的v.name.includes(filter)里,includes()是用来判断数组是否包含单个特定元素的,但你传进去的是一个数组filter,相当于你在问“v.name里有没有一个元素是['bob','john']这个数组?”,但你的v.name里全是字符串,当然匹配不上,所以才会返回空结果。
另外还要注意:你定义的data是个对象,不是数组,直接用data.filter()会报错哦,得先把它转换成数组才行(用Object.values(data)就能拿到对应的数组)。
符合你预期的解决方案
根据你的需求:
- 当
filter是['bob','john']时,只返回data[0](因为它的name同时包含bob和john) - 当
filter是['bob']时,返回两个对象(它们的name都包含bob)
这说明你需要的是:对象的name数组必须包含filter数组里的所有元素,这时候要用filter.every()来做判断,代码如下:
// 你的原始数据 const data = { 0: {key: 'abc', name: ['bob', 'john', 'steve']}, 1: {key: 'def', name: ['bob']} }; // 先把对象转为数组 const dataArray = Object.values(data); // 测试第一个filter const filter1 = ['bob', 'john']; const result1 = dataArray.filter(item => { // 检查filter里的每一个元素是否都在当前item的name数组中 return filter1.every(name => item.name.includes(name)); }); console.log(result1); // 输出:[{key: 'abc', name: ['bob', 'john', 'steve']}] // 测试第二个filter const filter2 = ['bob']; const result2 = dataArray.filter(item => { return filter2.every(name => item.name.includes(name)); }); console.log(result2); // 输出:[{key: 'abc', name: ['bob', 'john', 'steve']}, {key: 'def', name: ['bob']}]
额外补充:如果需求是“包含任意一个元素”
要是你之后需要的是只要name数组包含filter里的任意一个元素就保留,那把every换成some就行:
const filter3 = ['bob', 'john']; const result3 = dataArray.filter(item => { return filter3.some(name => item.name.includes(name)); }); console.log(result3); // 输出两个对象,因为data[1]的name里有bob
内容的提问来源于stack exchange,提问作者Scott Waddell
相关产品推荐
相关产品推荐

