首页 > 解决方案 > 创建属性并使用数组元素对其进行初始化时出现类型错误

问题描述

我正在用 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

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

在 JavaScript 中,如果一个变量已被声明,但尚未被赋值,则会自动赋值为 undefined 。因此,如果您尝试访问此类变量的值,则会抛出 Uncaught TypeError cannot set property of undefined 。

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

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

标签: javascriptarraysobjectproperties

解决方案


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

你的电话arrayToList(list, array, 0)很好。但是,在该函数内部,有一个对arrayToList(list.rest, array, n+1). list.rest不是什么。

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

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

推荐阅读