创建 属性 并使用数组元素对其进行初始化时出现 TypeError

TypeError when creating a property and initialising it with an array element

我正在 JavaScript 中编写我的第一个程序,我的想法是创建一个接受整数数组的函数,并使用从 属性 中获取的值制作一个列表(数据结构)数组元素(不知道如何迭代进行)。
该列表将是这样的:

{
value: 1,
rest: {
    value: 2,
    rest: {
        value: 3,
        rest: null
    }
}
}

我收到一个我不完全理解的错误。
这是程序:

function arrayToList(list, array, n)
{
    list.value = array[n];

    if( n < array.length - 1 ) arrayToList(list.rest, array, n+1);
}

const array = [1,2,3];

let list = {};

arrayToList(list, array, 0);

console.log(list);

这是错误:

list.value = array[n];
           ^
TypeError: Cannot set property 'value' of undefined

我在网上找到了以下定义:

In JavaScript if a variable has been declared, but has not been assigned a value, is automatically assigned the value undefined . Therefore, if you try to access the value of such variable, it will throw Uncaught TypeError cannot set property of undefined .

我不确定 undefined 是指 list.value 还是 arra[n],但据我所知(很少有 JS)该语句合法地创建和初始化value 属性 的 list 对象,所以问题应该是 array[n].
但是n0array.lenght - 1之间的整数,所以array[n]不能未定义。

请解释一下它是如何工作的。

这里的关键是问题不是出现在第一次迭代中,而是出现在第二次迭代中。

您拨打 arrayToList(list, array, 0) 没问题。但是,在该函数内部,有一个对 arrayToList(list.rest, array, n+1) 的递归调用。 list.rest 什么都不是。

老实说,我不太确定您在这种情况下期望做什么。目前尚不清楚您期望的 input/output 应该是什么。我认为您可能有兴趣查看这些函数,它们可以帮助您处理整个数组:

  • Array.map()
    使您能够处理数组中的每一项,返回一个新数组。
  • Array.reduce()
    获取整个数组并允许缩减为单个值。 (似乎最接近您的要求...减少到单个对象。)