繁体   English   中英

如何遍历包含另一个 object 的 object

[英]How to iterate through an object which contains another object

let list = {
    value: 15,
    rest: {
        value: 15,
        rest: {
            value: 15,
            rest: null
        }
    }
};

我想得到所有值的总和。 我怎样才能做到这一点?

你至少有两个选择:

  1. 递归

  2. 环形

递归

通过递归,您可以为此编写一个 function ,它会在必要时调用自身(递归)。

例如:

function sumValues(list) {
    let sum = list.value;
    if (list.rest) {
        // Recurse
        sum += sumValues(list.rest);
    }
    return sum;
}

现场示例:

 let list = { value: 15, rest: { value: 15, rest: { value: 15, rest: null } } }; function sumValues(list) { let sum = list.value; if (list.rest) { // Recurse sum += sumValues(list.rest); } return sum; } console.log(sumValues(list));

这可以用更短的方式编写,但我想强调上述步骤:

function sumValues(list) {
    return list.value + (list.rest ? sumValues(list.rest) : 0);
}

现场示例:

 let list = { value: 15, rest: { value: 15, rest: { value: 15, rest: null } } }; function sumValues(list) { return list.value + (list.rest? sumValues(list.rest): 0); } console.log(sumValues(list));

循环

但是,这种特殊的结构可以很好地与循环配合使用:

function sumValues(list) {
    let sum = 0;
    for (let entry = list; entry; entry = entry.rest) {
        sum += entry.value;
    }
    return sum;
}

现场示例:

 let list = { value: 15, rest: { value: 15, rest: { value: 15, rest: null } } }; function sumValues(list) { let sum = 0; for (let entry = list; entry; entry = entry.rest) { sum += entry.value; } return sum; } console.log(sumValues(list));

或使用while

function sumValues(list) {
    let sum = 0;
    let entry = list;
    while (entry) {
        sum += entry.value;
        entry = entry.rest;
    }
    return sum;
}

现场示例:

 let list = { value: 15, rest: { value: 15, rest: { value: 15, rest: null } } }; function sumValues(list) { let sum = 0; let entry = list; while (entry) { sum += entry.value; entry = entry.rest; } return sum; } console.log(sumValues(list));

使用递归是遍历所有嵌套对象的一种可能方式。

 let list = { value: 15, rest: { value: 15, rest: { value: 15, rest: null } } }; const sum = (list) => { let acc = list.value; if (list.rest) { acc += sum(list.rest); } return acc; } var res = sum(list); console.log(res);

具有解构赋值的迭代和递归解决方案。

 let list = { value: 3, rest: { value: 7, rest: { value: 15, rest: null } } }; function sum_iteratively({ value, rest }) { while(rest) { value += rest.value; rest = rest.rest; } return value; } function sum_recursively({ value, rest }) { return value + (rest?sum_recursively(rest):0); } console.log(sum_iteratively(list)); console.log(sum_recursively(list));
 .as-console-wrapper { top: 0; max-height: 100%;important; }

递归方法可以这样使用

function findSum(list){
    sum = list.value;
    if(list.rest){
        sum += findSum(list.rest);
    }
    return sum;
}
console.log(findSum(list));

或者像这样更简单

function findSum(list){
    return list.rest ? findSum(list.rest) + list.value : list.value;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM