[英]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.