我试图在JavaScript中使用数组创建列表。我最初使用点表示法来定义每个变量的新值。然而,这会产生看起来像数组中第一个值的无限列表。
{value: 10, rest: {value: 10, rest:{etc...}}}
作为提示给出的代码是在下面的函数中注释掉的代码。运行时,这会给出正确的输出(除了将null分配给我尚未编码的最后一个静止值)。
function arrayToList(array) {
var object = {};
for (var i = array.length - 1; i >= 0; i--) {
object.rest = object;
object.value = array[i];
//object = {value: array[i], rest: object};
}
return object;
}
console.log(arrayToList([10, 20]));
// → {value: 10, rest: {value: 20, rest: null}}
使用两种不同的方法有什么区别?
答案 0 :(得分:3)
您正在使用object
制作循环引用,因为您使用相同的对象分配给object.rest
。
function arrayToList(array) {
var object = {};
for (var i = array.length - 1; i >= 0; i--) {
object.rest = object;
object.value = array[i];
//object = {value: array[i], rest: object};
}
return object;
}
console.log(arrayToList([10, 20]));
// → {value: 10, rest: {value: 20, rest: null}}

另一个示例用作业覆盖object
。
function arrayToList(array) {
var object = {};
for (var i = array.length - 1; i >= 0; i--) {
//object.rest = object;
//object.value = array[i];
object = {value: array[i], rest: object};
}
return object;
}
console.log(arrayToList([10, 20]));
// → {value: 10, rest: {value: 20, rest: null}}

您可以使用带有{{3}}的短ES6版本来返回其余对象。
function toList(arr) {
var result = {};
arr.reduce((o, a) => (o.value = a, o.rest = {}), result);
return result;
}
console.log(toList([2, 3, 5, 7, 11]));

答案 1 :(得分:1)
我认为这可能是您链接列表的另一个实现。您只需将reduceRight
替换为reduce
即可更改链接方向。
function toList(arr) {
return arr.reduceRight(function(rest, value) {
return { value: value, rest: rest };
}, null);
}
console.log(toList([1, 3]));