2015-09-03 2 views
1

Это одна из проблем в книге, которую я не понимаю, или мой мозг не может сломать его. Вот функция решения:Преобразование массива в Связанный список - от Eloquent Javascript

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])); 
// → {value: 10, rest: {value: 20, rest: null}} 

поэтому мы зацикливание массива inversly поэтому первый список времени должен быть:

list = {value:20, rest:{value:20, rest:**mind blows here**}} 

может ли один помочь мне в этом процессе?

ответ

0

В основном вы создаете объект, который имеет внутри 2 элемента. первым элементом является значение, второй элемент - остальная часть списка. в строке list = {value:20, rest:{value:20, rest:list}} мы в основном создаем список от начала до конца, поэтому вы всегда добавляете список прежнего статуса. так что предположим, что у нас было 3 элемента [10,20,30]. 1. Мы начинаем с 30 - создаем объект с именем list с элементами value = 30, list = null. 2. Мы находимся в 20 - берём объект списка, который выглядит следующим образом: {value: 30, rest: null} и помещает его в новый объект с 20-значным значением, поэтому мы имеем {value: 20, rest:{**old list** --> {value:30, list:null} }} Теперь мы меняем ссылку списка чтобы указать на вновь созданный объект. list = {value: 20, rest:{**old list** --> {value:30, list:null} }} 3. Мы делаем то же самое, что и в 2.

Теперь у вас есть список. (Надеюсь, что было ясно)

0

С некоторых дополнительных бревнами

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

вы можете увидеть, что, хотя вы перебор списка в обратном порядке, value собственности list объекта будет последним итерированным элементом массива. Свойством rest будет копия list на этой итерации.

0

Просто шаг через него, отслеживание значений каждого имени/переменной, как вы идете:

Первоначально:

array = [10, 20] 
list = null 
i = 1 

Следующий шаг:

array = [10, 20] 
list = {value: 20, rest: null} 
i = 1 

Следующий шаг:

array = [10, 20] 
list = {value: 20, rest: null} 
i = 0 

Дальше tep:

array = [10, 20] 
list = {value: 10, rest: {value: 20, rest: null}} 
i = 0 

В этот момент контур и функция заканчиваются.

Ключ , когда операции выполнены. Так как это imperative программирование стиля (в отличие от (pure) functional), значение, связанное с именем (переменной), может быть изменено во время выполнения кода. Поэтому, когда считывается list, и когда задано list, новое значение имеет решающее значение.

+0

что будет выводить это: 'console.log (arrayToList ([10, 20, 30, 40, 50]));' Когда я выполняю это, я получаю: '{значение: 10, rest: {value: 20, rest: {значение: 30, rest: [Object]}}} '. Где остальные узлы? –

Смежные вопросы