操纵对象

时间:2015-07-25 19:56:44

标签: javascript object

我在Eloquent JavaScript第4章(http://eloquentjavascript.net/04_data.html)中练习3时遇到了这个问题。

基本上,它要我从数组中创建一个嵌套列表。

例如,arrayToList([1,2,3])应返回如下:

var list = {
  value: 1,
  rest: {
    value: 2,
    rest: {
      value: 3,
      rest: null
    }
  }
};

我的代码与for循环中的正确答案略有不同,但它没有返回预期的结果。

我的代码:

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

原始答案经过温和修改,使其看起来与我上面的代码更具可比性:

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

如您所见,我的代码仅与for循环中的原始答案不同。我想知道为什么我选择操纵对象list的方式不起作用。

提前谢谢!

2 个答案:

答案 0 :(得分:0)

在你的代码中,你正在创建一个无限递归的对象,通过在执行list.rest = list;时将对象分配给它的一个字段,并且因为你向后走数组,你得到的第一个数组值为{ {1}}在无限递归的对象中;而正确的答案是每次创建一个新对象并使用里面的旧对象。

答案 1 :(得分:0)

我相信当您执行list = something时,您正在为list.something = anotherthing设置一种新类型的对象。

使用list您正在更改列表,但是value正在修改value中的字段,而不是它。

使用您的代码,{{1}}只是一个字段,在其他代码中,{{1}}是之前定义的数组,您能看到差异吗?