Преобразование массива в список вложенных объектов - Eloquent Javascript 4.3 - PullRequest
0 голосов
/ 04 сентября 2018

Я смотрю на это упражнение из книги Eloquent Javascript, глава 4 - Список уже довольно давно, и я пытаюсь понять, как работает эта конкретная функция:

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

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


Даже после добавления list в окно «Наблюдение» в отладчике я не вижу четко следующее:


1. Каким образом оператор из списка = {value: array[i], rest: list}; добавляется к свойству rest вложенного объекта во время каждой итерации?


Очевидно, что точка .rest или скобка ['rest'] не используются, и явно не указывается, что во время каждой следующей итерации мы ссылаемся на свойство объекта или его более поздних вложенных объектов, так как же это получить добавляется к свойству каждого следующего вложенного объекта.

Я ожидаю, что на каждой итерации будет перезаписано содержимое объекта list, но это не так.

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

TL; DR: в каждой итерации мы создаем новый объект, содержащий объект из последней итерации.

В строке list = {value: array[i], rest: list}; оператор справа от = вычисляется первым. Это означает, что мы создаем объект {value: array[i], rest: list}, содержащий текущие значения array[i] и list. В первой итерации list равно null, а array[i] равно 20, поэтому объект выглядит следующим образом:

{value: 20, rest: null}

Только тогда мы назначим этот объект list.

В следующей итерации list уже не null, а {value: 20, rest: null}. Итак, теперь объект, который мы создаем и присваиваем list, выглядит следующим образом:

{value: 10, rest: {value: 20, rest: null}}
0 голосов
/ 04 сентября 2018

Я попытался немного объяснить здесь. Дайте мне знать, если что-то неясно

function arrayToList(array) {
  // declare a empty variable to use is as a list
  let list = null;

  // Now iterate from the last element to the first. Example [10, 20]
  for (let i = array.length - 1; i >= 0; i--) {

    // iteration 1: i = 1 
    // we assign to list...
    list = {
        //the value of the current element
        value: array[i], // value = 20
        // the current list value before current assign
        rest: list // rest = null
    };
    // now it is assigned. list = {value: 20, rest: null}

    // ....

    // iteration 2: i = 0
    // we assign to list...
    list = {
        //the value of the current element
        value: array[i], // value = 10
        // the current list value before current assign
        rest: list // rest = {value: 20, rest: null}
    };
    // now it is assigned. list = {value: 10, rest: {value: 20, rest: null}}

  }
  return list;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...