鉴于以下情况,如何返回单个数组?
let array = [{
name: "name01",
arr: [
{name: "inner01"},
{name: "inner02"},
{name: "inner03"}
]
}, {
name: "name02",
arr: [
{name: "inner04"},
{name: "inner05"},
{name: "inner06"}
]
}
]
let convo = array.map(item => {
return {
name: item.name,
...item.arr,
};
});
https://jsfiddle.net/3ng8dc2x/1/
我想得到类似的东西:
[
{name: "name01"},
{name: "inner01"},
{name: "inner02"},
{name: "inner03"},
{name: "name02"},
{name: "inner04"},
{name: "inner05"},
{name: "inner06"}
]
一如既往地感谢所有方向,所以在此先感谢您!
答案 0 :(得分:5)
如果您是为最新的浏览器和最新的节点编写的,flatMap()
则非常适合:
let array = [{
name: "name01",
arr: [
{name: "inner01"},
{name: "inner02"},
{name: "inner03"}
]
}, {
name: "name02",
arr: [
{name: "inner04"},
{name: "inner05"},
{name: "inner06"}
]
}
]
let flat = array.flatMap(({name, arr}) => [{name}, ...arr])
console.log(flat)
答案 1 :(得分:2)
数组reduce可能比map更好。
let array = [{
name: "name01",
arr: [
{name: "inner01"},
{name: "inner02"},
{name: "inner03"}
]
}, {
name: "name02",
arr: [
{name: "inner04"},
{name: "inner05"},
{name: "inner06"}
]
}
]
let convo = array.reduce((a, {name, arr}) => a.concat([{name}], arr), []);
console.log(convo)
答案 2 :(得分:0)
您可以使用reduce和destructuring assignment
let array = [{name: "name01", arr: [{name: "inner01"}, {name: "inner02"}, {name: "inner03"}]},
{name: "name02", arr: [{name: "inner04"}, {name: "inner05"}, {name: "inner06"}]}]
let op = array.reduce((op,{name,arr}) =>op.concat([{name}],arr),[])
console.log(op)
答案 3 :(得分:0)
一种可能的解决方案是将Array.reduce()与Object.entries组合在一起,对于当前检查的object
的每个条目,检查类型以确定如何将元素放置在新数组上: / p>
let array = [
{
name: "name01",
surname: "surname01",
arr: [{name: "inner01"}, {name: "inner02"}, {name: "inner03"}]
},
{
name: "name02",
surname: "surname02",
arr: [{name: "inner04"}, {name: "inner05"}, {name: "inner06"}]
}
];
let res = array.reduce((acc, curr) =>
{
Object.entries(curr).forEach(([k, v]) =>
{
if (typeof v === 'string')
acc.push({[k]: v});
else if (Array.isArray(v))
acc.push(...v);
});
return acc;
}, []);
console.log(res);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
请注意,前一种可能是通用解决方案,但是,如果您可以信任对象的结构,即它们都具有一个name
属性,其中包含一个string
和一个{{1 }}放在属性array
上,则可以简化代码:
arr
let array = [
{
name: "name01",
arr: [{name: "inner01"}, {name: "inner02"}, {name: "inner03"}]
},
{
name: "name02",
arr: [{name: "inner04"}, {name: "inner05"}, {name: "inner06"}]
}
];
let res = array.reduce(
(acc, {name, arr}) => acc.concat([{name}, ...arr]),
[]
);
console.log(res);
答案 4 :(得分:0)
使用Array.map()/ Array.reduce()进行功能编程的方法将达到目的,如其他答案所示。
让我提供一个替代的观点是使用递归。
const array = [{
name: "name01",
arr: [
{name: "inner01"},
{name: "inner02"},
{name: "inner03"}
]
}, {
name: "name02",
arr: [
{name: "inner04"},
{name: "inner05"},
{name: "inner06"}
]
}
]
const flattenToSingleArray = (array, result = []) => {
for (const {name, arr} of array) {
result.push({name});
if (arr) {
flattenToSingleArray(arr, result);
}
}
return result;
}
console.log(flattenToSingleArray(array));
这是如何工作的,我们迭代array
,然后迭代destructuring每个对象(每次迭代中的元素)。然后,我们将name
属性及其值推入结果中。我们通过子对象(在每个对象中用arr
表示)进行递归。