arrayToList производит нечетные выходные данные. В чем дело? - PullRequest
0 голосов
/ 08 января 2019

Я делал это упражнение для книги, и он просит написать функцию, которая преобразует массивы в списки (объект со свойствами «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.

Может кто-нибудь объяснить мне, что не так?

1 Ответ

0 голосов
/ 08 января 2019

Объекты Javascript, по сути, вызывают по ссылке. Поэтому, когда вы устанавливаете tempList в список, вы просто создаете указатель , а не копию, и, следовательно, во второй раз в цикле вы устанавливаете list.rest, чтобы он указывал на себя, создавая таким образом бесконечное число rest-> {10, rest -> {10, rest -> 10 ..... что вы хотите сделать, это "указать" список на новый объект, как в решении книги.

...