从数组

时间:2016-07-16 17:19:33

标签: javascript

我试图在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}}

使用两种不同的方法有什么区别?

2 个答案:

答案 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]));