Object.keys的顺序相反

时间:2016-07-10 17:11:54

标签: javascript

我有一个有趣的任务。我解决了一半,但无法找到解决剩下的问题的解决方案。希望有人能指出我正确的方向。

我发现solution接近我的任务。但我的略有不同,使用ES6。

有嵌套对象。

let someList = {

   value: 1,

   next: {

      value: 2,

      next: {

         value: 3,

         next: {

            value: 4,

            next: null

            }

         }

    }

};

我收到了所有的价值观。

function reversePrint(linkedList) {

Object.keys(linkedList).map(key => {
let myKey = linkedList[key];
typeof myKey == "object" ?  console.log(reversePrint(myKey)) : console.log(myKey);
});

}

reversePrint(someList);

但问题是:我如何以相反的顺序获得所有值?

小提琴:https://jsfiddle.net/L83puqbz/17/

我尝试使用reduce来制作数组并将其反转,但每个值都在单独的数组中。

小提琴https://jsfiddle.net/L83puqbz/20/

任何帮助都会受到极大关注。

2 个答案:

答案 0 :(得分:5)

编辑 - 抱歉是的,更多解释。

以下代码将浏览链接列表并以相反的顺序打印值。

由于日志是在递归调用之后,因此在控制台日志开始之前,这将一直到最后一个节点。然后在每个控制台日志之后,堆栈中的当前函数将结束,允许前一个函数继续打印。

let someList = {
  value: 1,
  next: {
    value: 2,
    next: {
      value: 3,
      next: {
        value: 4,
        next: null
      }
    }
  }
};

function printAfter(node){
  if(node.next != null){
    printAfter(node.next);
  }
  console.log(node.value);
}

printAfter(someList)

答案 1 :(得分:3)

正如其他人所建议的那样,你可以通过递归来做到这一点。

function reverse(node) {
    return (node.next === null) ? [node.value] : [...reverse(node.next), node.value];
}

或者,你可以使用一个简单的循环:

function reversedValues(node) {
    const values = [];
    while (node !== null) {
        values.unshift(node.value);
        node = node.next;
    }
    return values;
}

第一种解决方案的优点是简洁和优雅。缺点是,如果您的链表非常庞大,它可能会导致堆栈溢出。第二种解决方案更加笨拙和冗长,但它不容易出现堆栈溢出。