繁体   English   中英

遍历嵌套的对象数组

[英]Looping through nested array of objects

我有以下对象数组,其中包含嵌套的 arrays。 我想遍历那些 arrays 并将所有这些影响信息提取到单独的数组中:

这就是我的输入数据的样子:

{
    "violations": [{
            "impact": "serious",
            "nodes": [{
                "any": [{
                        "impact": "critical"
                    },
                    {
                        "impact": "serious"
                    }
                ],
                "all": [{
                    "impact": "moderate"
                }],
                "none": [{
                    "impact": "minor"
                }]
            }]
        },
        {
            "impact": "serious",
            "nodes": [{
                "any": [{
                        "impact": "serious"
                    },
                    {
                        "impact": "minor"
                    }
                ],
                "all": [{
                    "impact": "moderate"
                }],
                "none": [{
                    "impact": "serious"
                }]
            }]
        },
        {
            "impact": "serious",
            "nodes": [{
                    "any": [{
                            "impact": "critical"
                        },
                        {
                            "impact": "critical"
                        }
                    ],
                    "all": [{
                        "impact": "moderate"
                    }],
                    "none": [{
                        "impact": "moderate"
                    }]
                },
                {
                    "any": [{
                            "impact": "critical"
                        },
                        {
                            "impact": "critical"
                        }
                    ],
                    "all": [{
                        "impact": "moderate"
                    }],
                    "none": [{
                        "impact": "moderate"
                    }]
                }
            ]
        }
    ]
}

预期 output:

[
  {
    "impact": "serious"
  },
  {
    "impact": "critical"
  },
  {
    "impact": "serious"
  },
  {
    "impact": "moderate"
  },
  {
    "impact": "minor"
  },
  {
    "impact": "serious"
  },
  {
    "impact": "serious"
  },
  {
    "impact": "minor"
  },
  ......
]

我目前正在尝试使用 forEach 循环,如下所示:

const results = [];
violations.forEach(({ nodes, impact }) => {
  results.push({ impact });
  // flattening nodes
  nodes.forEach(({ any, all, none }) => {
    any.forEach((v) => results.push(v));
    all.forEach((v) => results.push(v));
    none.forEach((v) => results.push(v));
  });
});

有没有更好更短的方法来做同样的事情?

您可以实现如下代码段所示的结果:

 const items = { "violations": [ { "impact": "serious", "nodes": [ { "any": [ { "impact": "critical" }, { "impact": "serious" } ], "all": [ { "impact": "moderate" } ], "none": [ { "impact": "minor" } ] } ] }, { "impact": "serious", "nodes": [ { "any": [ { "impact": "serious" }, { "impact": "minor" } ], "all": [ { "impact": "moderate" } ], "none": [ { "impact": "serious" } ] } ] }, { "impact": "serious", "nodes": [ { "any": [ { "impact": "critical" }, { "impact": "critical" } ], "all": [ { "impact": "moderate" } ], "none": [ { "impact": "moderate" } ] }, { "any": [ { "impact": "critical" }, { "impact": "critical" } ], "all": [ { "impact": "moderate" } ], "none": [ { "impact": "moderate" } ] } ] } ] } const newItems = items.violations.reduce((acc, {impact, nodes})=> { acc.push({impact}); nodes.forEach(item => { Object.keys(item).forEach(key => { acc.push(...item[key]); }) }) return acc }, []); console.log(newItems);

这是你的解决方案

let output = []
function recursion(obj, op) {
    if (typeof obj === 'object') {
        if (obj.impact) {
            op.push({ impact: obj.impact })
        }
        for (var key in obj) {
            recursion(obj[key], op)
        }
    }
    return
}

recursion(obj, output)
console.log(output)

可运行代码是

 let obj = { "violations": [ { "impact": "serious", "nodes": [ { "any": [ { "impact": "critical" }, { "impact": "serious" } ], "all": [ { "impact": "moderate" } ], "none": [ { "impact": "minor" } ] } ] }, { "impact": "serious", "nodes": [ { "any": [ { "impact": "serious" }, { "impact": "minor" } ], "all": [ { "impact": "moderate" } ], "none": [ { "impact": "serious" } ] } ] }, { "impact": "serious", "nodes": [ { "any": [ { "impact": "critical" }, { "impact": "critical" } ], "all": [ { "impact": "moderate" } ], "none": [ { "impact": "moderate" } ] }, { "any": [ { "impact": "critical" }, { "impact": "critical" } ], "all": [ { "impact": "moderate" } ], "none": [ { "impact": "moderate" } ] } ] } ] } let output = [] function recursion(obj, op) { if (typeof obj === 'object') { if (obj.impact) { op.push({ impact: obj.impact }) } for (var key in obj) { recursion(obj[key], op) } } return } recursion(obj, output) console.log(output)

这应该这样做:

const impacts = data.violations.map(({impact,nodes}) => 
    [{impact}, ...nodes.map(({any,all,none}) => [...any, ...all, ...none]).flat()]
)
.flat();

 const data = { "violations": [{ "impact": "serious", "nodes": [{ "any": [{ "impact": "critical" }, { "impact": "serious" } ], "all": [{ "impact": "moderate" }], "none": [{ "impact": "minor" }] }] }, { "impact": "serious", "nodes": [{ "any": [{ "impact": "serious" }, { "impact": "minor" } ], "all": [{ "impact": "moderate" }], "none": [{ "impact": "serious" }] }] }, { "impact": "serious", "nodes": [{ "any": [{ "impact": "critical" }, { "impact": "critical" } ], "all": [{ "impact": "moderate" }], "none": [{ "impact": "moderate" }] }, { "any": [{ "impact": "critical" }, { "impact": "critical" } ], "all": [{ "impact": "moderate" }], "none": [{ "impact": "moderate" }] } ] } ] }; const impacts = data.violations.map(({impact,nodes}) => [{impact}, ...nodes.map(({any,all,none}) => [...any, ...all, ...none]).flat()] ).flat(); console.log( impacts );

或者:对你的稍作修改

let results = [];
data.violations.forEach(({nodes,impact}) => {
    results.push({impact});
    // flattening nodes
    nodes.forEach(({any,all,none}) =>
        results.concat(...[...any, ...all, ...none])
    );
});

 const data = { "violations": [{ "impact": "serious", "nodes": [{ "any": [{ "impact": "critical" }, { "impact": "serious" } ], "all": [{ "impact": "moderate" }], "none": [{ "impact": "minor" }] }] }, { "impact": "serious", "nodes": [{ "any": [{ "impact": "serious" }, { "impact": "minor" } ], "all": [{ "impact": "moderate" }], "none": [{ "impact": "serious" }] }] }, { "impact": "serious", "nodes": [{ "any": [{ "impact": "critical" }, { "impact": "critical" } ], "all": [{ "impact": "moderate" }], "none": [{ "impact": "moderate" }] }, { "any": [{ "impact": "critical" }, { "impact": "critical" } ], "all": [{ "impact": "moderate" }], "none": [{ "impact": "moderate" }] } ] } ] }; let results = []; data.violations.forEach(({ nodes, impact }) => { results.push({ impact }); // flattening nodes nodes.forEach(({ any, all, none }) => results.concat(...[...any, ...all, ...none]) ); }); console.log( results );

我觉得递归将成为您的朋友,其优点是无论您如何更改嵌套级别,它都会继续工作。

这将返回一个类似于您正在寻找的数组:

function extractImpactInformation(data) {
  const results = [];
  if (typeof data === 'object') {
    if (data['impact']) {
      results.push({ 'impact': data['impact'] });
    }
    for (const key in data) {
      results.push(...extractImpactInformation(data[key]));
    }
  }
  
  return results;
}

 const testData = { "violations": [ { "impact": "serious", "nodes": [ { "any": [ { "impact": "critical" }, { "impact": "serious" } ], "all": [ { "impact": "moderate" } ], "none": [ { "impact": "minor" } ] } ] }, { "impact": "serious", "nodes": [ { "any": [ { "impact": "serious" }, { "impact": "minor" } ], "all": [ { "impact": "moderate" } ], "none": [ { "impact": "serious" } ] } ] }, { "impact": "serious", "nodes": [ { "any": [ { "impact": "critical" }, { "impact": "critical" } ], "all": [ { "impact": "moderate" } ], "none": [ { "impact": "moderate" } ] }, { "any": [ { "impact": "critical" }, { "impact": "critical" } ], "all": [ { "impact": "moderate" } ], "none": [ { "impact": "moderate" } ] } ] } ] } function extractImpactInformation(data) { const results = []; if (typeof data === 'object') { if (data['impact']) { results.push({ 'impact': data['impact'] }); } for (const key in data) { results.push(...extractImpactInformation(data[key])); } } return results; } console.log(extractImpactInformation(testData));

您可以像这样创建一个减速器 function 来对您的影响数据进行分组。

const impactReducer = (acc, {impact, nodes}) => {
  if (impact) acc.push({impact});
  
  nodes?.forEach(node => Object.keys(node).forEach(key => node[key].reduce(impactReducer, acc)));  
  
  return acc;
};

const impacts = items.violations.reduce(impactReducer, []);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM