我目前正在EloquentJS书中进行练习。第四章,更精确地列出清单。
我尝试了一些看起来很合理的方法,但是得到了我不理解的回报。我得到了一个圆形标签/标记。
分别是我的第一次尝试和我的第二次尝试:
function arrayToListTry1 (array) {
/**My solution try 1
My observations:
I was building it inverted (last elem in first place
I don't understand why my version gets a circular result and the book solution doesn't
*/
let list = {
value: "",
rest: {}
};
for (let i = 0; i < array.length; i++) {
list.rest = list;
list.value = array[i];
}
return list;
}
/**result:
node eloquentJS_chapter4_ex_arrayToList.js
{ rest: [Circular], value: 'hello' }
*/
function arrayToListTry2 (array) {
let list = {};
for (let i = array.length - 1; i >= 0; i--) {
list.rest = list;
list.value = array[i];
}
return list;
}
//same result
运动解决方案显示了我已经检查过的另一种方式,但是不清楚我的解决方案有什么问题。我也检查了stackoverflow,其他人对此练习说了些什么,但找不到我理解的解释。
这里是实际的运动解决方案:
function arrayToList(array) {
let list = null;
for (let i = array.length - 1; i >= 0; i--) {
list = {value: array[i], rest: list};
}
return list;
}
/**
result:
node eloquentJS_chapter4_ex_arrayToList.js
{ value: 'hello',
rest: { value: 'world', rest: { value: '!!!', rest: null } } }
*/
您的for
循环基本上是此语句:
list.rest = list; // this gets constantly reassigned
list.value = array[array.length - 1];
因为rest
与list
相同,所以有一个循环,而JS向您显示了该循环。
本书解决方案通过创建新列表而不是一次又一次地重复使用同一列表来避免此问题。