我有以下物件陣列,其中包含嵌套陣列。我想遍歷這些陣列并將所有這些影響資訊提取到單獨的陣列中:
這是我的輸入資料的樣子:
{
"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"
}]
}
]
}
]
}
預期輸出:
[
{
"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));
});
});
有沒有更好和更短的方法來做同樣的事情?
uj5u.com熱心網友回復:
您可以實作如下代碼段所示的結果:
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);
uj5u.com熱心網友回復:
這應該這樣做:
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 = results.concat(...[...any, ...all, ...none])
);
});
console.log( results );
uj5u.com熱心網友回復:
這是你的解決方案
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)
uj5u.com熱心網友回復:
我覺得遞回將成為你的朋友,優點是無論你改變嵌套級別多少,它都會繼續作業。
這將回傳一個類似于您要查找的陣列:
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));
uj5u.com熱心網友回復:
您可以創建一個像這樣的 reducer 函式來對您的影響資料進行分組。
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, []);
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/378998.html
標籤:javascript 节点.js 数组 循环
