我想编写一个遍历嵌套数组的函数,并返回n个值的总和(参见下面的示例)。
var children = {
value: 1,
children: {
value: 3,
children: {
value: 2,
children: {
value: 5,
children: {
value: 3
}
}
}
}
}
我认为我需要使用递归,这就是我想象的应该去:
1)功能需要params' array'和一个' targetLevel' (它应该进入的深度)并返回'值的总和'从级别[0]到级别[nth]。
2)在开始时,函数检查内部的level是否等于param level(如果是,则将当前级别添加到var值然后返回它)。
3)在每次迭代中发生以下条件之前:
示例:
countNthValue(children,3)将返回数字6 - >级别[0]上的值+级别[1]上的值+级别[2]上的值
那么,我是否正确地掌握了基本概念(递归调用函数,每次迭代存储数组的较小部分)?如果是这样,我该如何正确编写函数?
如果没有,这只是一个胡言乱语,我如何访问嵌套数组的第n级?
答案 0 :(得分:0)
根据您给出的对象,答案是14
var children = {
value: 1,
children: {
value: 3,
children: {
value: 2,
children: {
value: 5,
children: {
value: 3
}
}
}
}
}
function sumChildren(children){
if(children == undefined|| children== null) return 0;
return children.value + sumChildren(children.children);
}
console.log(sumChildren(children));
答案 1 :(得分:0)
建议:
foo::swap
答案 2 :(得分:0)
var children = {
value: 1,
children: {
value: 3,
children: {
value: 2,
children: {
value: 5,
children: {
value: 3
}
}
}
}
}
function countNthValue (array, depth, current){
if(typeof current === 'undefined') {
current = 1;
}
if (depth > current && array.children) {
return array.value + countNthValue(array.children, depth, current+1);
} else {
return array.value;
}
}
// Test
console.log(countNthValue (children, 1));
console.log(countNthValue (children, 2));
console.log(countNthValue (children, 3));
console.log(countNthValue (children, 4));
console.log(countNthValue (children, 5));
console.log(countNthValue (children, 6));
答案 3 :(得分:0)
你可以这样做
var children = {
value: 1,
children: {
value: 3,
children: {
value: 2,
children: {
value: 5,
children: {
value: 3
}
}
}
}
},
sums = (e, v) => !!e.children ? sums(e.children, v + e.value) : v + e.value;
document.write("<pre>" + sums(children,0) + "</pre>");
答案 4 :(得分:0)
我建议使用数组和对象的组合,以及递归调用内部Array#reduce
的函数来对值进行求和。
var children = [{
value: 1,
children: [{
value: 3,
children: [{
value: 2,
children: [{
value: 5,
children: [{
value: 3
}]
}]
}]
}]
}],
i;
function getLevel(array, level) {
return ~level && Array.isArray(array) ?
array.reduce(function (r, a) {
return r + a.value + getLevel(a.children, level - 1);
}, 0) :
0;
}
for (i = 0; i < 5; i++) {
document.write(getLevel(children, i) + '<br>');
}