如何在Javascript中为复杂的对象数组链接映射和过滤方法?

问题描述

我有一个数组如下:

var arr = [
    {                                                   
        subArray1:[
            {
                subArray2:[
                    {
                        value: 1
                    },{
                        value: 0
                    }
                ]
            },{
                subArray2:[
                    {
                        value: 1
                    },{
                        value: 0
                    }
                ]
            }
        ]
    }
];

我想过滤掉 subArray2 中包含值 1 的所有对象并返回整个数组。 预期输出如下:

newArr= [
    {                                                   
        subArray1:[
            {
                subArray2:[
                    {
                        value: 1
                    }
                ]
            },{
                subArray2:[
                    {
                        value: 1
                    }
                ]
            }
        ]
    }
]

我无法以获取上述所需输出的方式链接 map 和 filter 方法。 请帮助我实现这一目标。

解决方法

您需要映射每个 arr 项和每个 arr.subArray1 项,然后过滤 subArray2

var arr = [
    {                                                   
        subArray1:[
            {
                subArray2:[
                    {
                        value: 1
                    },{
                        value: 0
                    }
                ]
            },{
                subArray2:[
                    {
                        value: 1
                    },{
                        value: 0
                    }
                ]
            }
        ]
    }
];

console.log(
    arr.map(({...el}) => {
        el.subArray1 = el.subArray1.map(({...el1}) => {
            el1.subArray2 = el1.subArray2.filter(({value}) => value !== 0);
            return el1;
        });
        return el;
    })
)

,

假设只有那些嵌套数组,您可以将函数 reduce 与函数 filter 一起使用。

const arr = [    {                                                           subArray1:[            {                subArray2:[                    {                        value: 1                    },{                        value: 0                    }                ]            },{                subArray2:[                    {                        value: 1                    },{                        value: 0                    }                ]            }        ]    }],result = arr.reduce((a,{subArray1}) => {
      a.push({
        subArray1: subArray1.reduce((a,{subArray2}) => {
            a.push({subArray2: subArray2.filter(({value}) => value === 1)});
            return a;
          },[])
        });
        
        return a;
      },[]);
      
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }