如何用数组过滤JavaScript对象数组?执行结果异常求解
解决JavaScript数组过滤后返回多个独立数组的问题
你的问题出在使用forEach遍历arr2时,每次调用filter都会生成一个新的数组并直接输出,所以会得到三个独立的结果数组,而不是合并后的单一数组。另外还要注意,有些元素可能会被多个前缀匹配(比如A0001同时匹配A0和A00),直接合并会出现重复元素,需要处理去重或者用更高效的过滤逻辑。
方案一:用filter + some直接生成目标数组(推荐)
这种方法只需要一次filter遍历arr1,通过some检查当前元素是否匹配arr2中的任意前缀,既高效又能避免重复元素:
const arr1 = [ {"id":"A0001", "user":"asdf"}, {"id":"A0002", "user":"fgh"}, {"id":"A0122", "user":"fegr"}, {"id":"B0003","user":"dff"}, {"id":"B1567", "user":"asdf"}, {"id":"C0012", "user":"dwdw"} ]; const arr2 = ['A0', 'B0', 'A00']; const filteredResult = arr1.filter(element => { // 检查当前元素的id是否匹配arr2中的任意前缀 return arr2.some(prefix => element.id.indexOf(prefix) !== -1); }); console.log(filteredResult);
运行这段代码会直接输出你预期的结果:
[ {"id":"A0001", "user":"asdf"}, {"id": "A0002", "user":"fgh"}, {"id":"A0122", "user":"fegr"}, {"id": "B0003","user":"dff"} ]
方案二:合并数组后去重(适合需要保留中间数组的场景)
如果你确实需要先收集每个前缀匹配的数组,再合并成一个结果,可以先合并所有数组,然后通过id去重:
const arr1 = [ {"id":"A0001", "user":"asdf"}, {"id":"A0002", "user":"fgh"}, {"id":"A0122", "user":"fegr"}, {"id":"B0003","user":"dff"}, {"id":"B1567", "user":"asdf"}, {"id":"C0012", "user":"dwdw"} ]; const arr2 = ['A0', 'B0', 'A00']; // 收集每个前缀匹配的数组 const matchedArrays = arr2.map(prefix => arr1.filter(el => el.id.indexOf(prefix) !== -1)); // 合并所有数组 const combinedArrays = [].concat(...matchedArrays); // 根据id去重 const uniqueResult = Array.from(new Set(combinedArrays.map(item => item.id))) .map(id => combinedArrays.find(item => item.id === id)); console.log(uniqueResult);
原代码问题解析
你原来的forEach循环会对arr2中的每个元素单独执行filter,每次执行都会输出一个只匹配当前前缀的数组,所以会得到三个独立的结果。而我们需要的是把所有符合条件的元素整合到一个数组里,上面的两种方案都能实现这个需求,第一种更简洁高效。
内容的提问来源于stack exchange,提问作者asdf
相关产品推荐
相关产品推荐

