如何在JavaScript中从嵌套对象数组筛选is_Y为'Y'的对象?
问题:筛选嵌套数组中is_Y为'Y'的对象并转为一维数组
原代码尝试筛选嵌套数组中is_Y === 'Y'的对象,但返回保留了原嵌套结构,无法得到期望的一维结果数组。
原代码
const tmpArray = [ [{ "no": 1, "is_Y": "Y", }], [{ "no": 2, "is_Y": "N", }], [{ "no": 3, "is_Y": "Y", }], [{ "no": 3, "is_Y": "N", }], [{ "no": 4, "is_Y": "Y", }], [{ "no": 5, "is_Y": "N", }, { "no": 6, "is_Y": "Y" }] ]; function findY(array) { return array.filter(function (item) { return item.filter(function (item2) { return item2.is_Y === 'Y'; }); }); } console.log(findY(tmpArray));
当前返回结果
[ [ { no: 1, is_Y: 'Y' } ], [ { no: 2, is_Y: 'N' } ], [ { no: 3, is_Y: 'Y' } ], [ { no: 3, is_Y: 'N' } ], [ { no: 4, is_Y: 'Y' } ], [ { no: 5, is_Y: 'N' }, { no: 6, is_Y: 'Y' } ] ]
期望结果
[ { no: 1, is_Y: 'Y' }, { no: 3, is_Y: 'Y' }, { no: 4, is_Y: 'Y' }, { no: 6, is_Y: 'Y' } ]
解决方案
方法一:扁平化数组后筛选
先使用flat()将嵌套数组转为一维,再用filter筛选符合条件的对象:
function findY(array) { // Infinity适配任意深度嵌套,已知两层也可写2 return array.flat(Infinity).filter(item => item.is_Y === 'Y'); }
方法二:用reduce合并筛选结果
通过reduce遍历外层数组,将内层筛选出的符合条件对象合并到结果数组:
function findY(array) { return array.reduce((result, innerArr) => { return result.concat(innerArr.filter(item => item.is_Y === 'Y')); }, []); }
方法三:手动遍历收集
通过两层forEach遍历数组,将符合条件的对象手动推入结果数组:
function findY(array) { const result = []; array.forEach(innerArr => { innerArr.forEach(item => { if (item.is_Y === 'Y') result.push(item); }); }); return result; }
内容的提问来源于stack exchange,提问作者peter
相关产品推荐
相关产品推荐

