【问题标题】:arrayToList producing odd outputs. What's wrong?arrayToList 产生奇数输出。怎么了?
【发布时间】:2019-01-08 19:46:15
【问题描述】:

我在一本书上做这个练习,它要求编写一个将数组转换为列表的函数(一个具有“value”属性的对象,它存储值,以及“rest”,它指向下一个值)。

以下是书中给出的解决方案:

    function arrayToList(array) {
      var list = null;
      for (var i = array.length - 1; i >= 0; i--)
        list = {value: array[i], rest: list};
      return list;
    }

    console.log(arrayToList([10, 20, 30]));
// → {value: 10, rest: {value: 20, rest: {value: 30, rest: null}}}

这是我想出的解决方案:

function arrayToList(array){
  var list = {value: null, rest: null};
  var tempList={value: array[array.length-1], rest: null};
  for(var i=array.length-2; i>=0;i--){
     list.value = array[i];
     list.rest = tempList;
     tempList = list;
  }
  return list;
};
console.log(arrayToList([10, 20, 30]));

但这会产生如下所示的结果:

{value: 10, rest: {value: 10, rest: {value: 10, …}}}

它适用于由 2 个元素组成的数组以及任何超过该元素的数组,就会发生这个 10 秒的循环。我试图剖析代码以查看发生这种情况的确切位置……这似乎是将列表分配给 tempList 的位置。

谁能给我解释一下怎么回事?

【问题讨论】:

  • 为什么在 for 循环中调用 array.length-2?它应该是 array.length-1 就像示例一样。
  • Lloyd Nicholson,我这样做是因为我已经在循环之外做了 array.length-1 元素。在循环开始时将其设置为 array.length-2 元素的“rest”值。

标签: javascript arrays list data-structures linked-list


【解决方案1】:

Javascript 对象本质上是通过引用调用的。因此,当您将 tempList 设置为 list 时,您只是创建了一个 指针,而不是副本,因此在第二次循环中,您将 list.rest 设置为指向自身,从而创建一个无限休息-> {10,休息-> {10,休息-> 10 .....您要做的是将列表“指向” new 对象,就像书中的解决方案一样。

【讨论】:

    猜你喜欢
    • 2014-12-16
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 2020-11-18
    • 2012-07-19
    • 1970-01-01
    相关资源
    最近更新 更多