我有一个JavaScript对象。有没有一种内置的或公认的最佳实践方法来获取所有子元素的长度,在这种情况下,对于数组中的第一个对象,它应该是1,对于第二个对象,它应该是2,总数减少到3。
const testData = [
{
account: "A",
children: [
{
account: "Test",
children: [],
},
],
}, {
account: "B",
children: [
{
account: "Test1",
children: [],
},
{
account: "Test2",
children: [],
},
],
},
]
递归解,如果需要的话
const testData = [
{
account: "A",
children: [
{
account: "Test",
children: [{account:"Test-Grandchild", children:[{account:"Test-Great-Grandchild", children:[]}]}],
},
],
}, {
account: "B",
children: [
{
account: "Test1",
children: [],
},
{
account: "Test2",
children: [],
},
],
},
]
const countChildren = obj => obj.children.length + obj.children.reduce((acc,c) => acc + countChildren(c), 0 );
const result = testData.reduce ( (acc,c) => acc + countChildren(c),0)
console.log(result);
当然,Array.reduce
const nOfTestDataChildren = [
{
account: "A",
children: [
{
account: "Test",
children: [],
},
],
}, {
account: "B",
children: [
{
account: "Test1",
children: [],
},
{
account: "Test2",
children: [],
},
],
},
].reduce( (acc, val) => acc + val.children.length, 0);
console.log(nOfTestDataChildren);
我认为Kooilnic
的答案非常适合这种情况,因为我们正在将数组减少为单个数值,它应该被接受为实际答案。但我想提出另一个解决方案,使用Array.forEach
:
const testData = [
{
account: "A",
children: [
{
account: "Test",
children: [],
},
],
}, {
account: "B",
children: [
{
account: "Test1",
children: [],
},
{
account: "Test2",
children: [],
},
],
},
]
let numberOfChildren = 0
testData.forEach(datum => numberOfChildren += datum.children.length)
console.log({ numberOfChildren })