获取对象数组键值遇TypeError求助:undefined is not an object
问题描述
尝试获取对象数组的键值时,能成功获取长度和项的键,但获取索引对应内容时抛出错误:TypeError: undefined is not an object (evaluating 'Object.keys(tasks[0])')
数据结构
{"task1": [{"en": [Array]}, {"ku": [Array]}], "task2": [{"en": [Array]}, {"ku": [Array]}]}
测试代码与结果
代码1(成功获取键)
useEffect(() => { const checkIfCorrect = newData.map((data) => { return data.map((dataItems) => { return dataItems.map((tasks, i) => { return console.log(Object.keys(tasks)); // <----- }); }); }); }, [newData]);
输出:
["task1", "task2"]
代码2(成功获取长度)
useEffect(() => { const checkIfCorrect = newData.map((data) => { return data.map((dataItems) => { return dataItems.map((tasks, i) => { return console.log(Object.keys(tasks).length); // <----- }); }); }); }, [newData]);
输出:
2
代码3(报错)
useEffect(() => { const checkIfCorrect = newData.map((data) => { return data.map((dataItems) => { return dataItems.map((tasks, i) => { return console.log(Object.keys(tasks[0])); // <----- }); }); }); }, [newData]);
错误信息:
TypeError: undefined is not an object (evaluating 'Object.keys(tasks[0])')
问题原因与解决方法
从输出结果能明确看出,tasks本身是包含task1、task2的对象,不是数组。你写tasks[0]是把它当成数组去取索引0的元素,但对象没有数字索引,所以tasks[0]返回undefined,调用Object.keys()自然会报错。
如果想获取task1或task2对应数组里的元素键,要通过对象的键名访问,比如:
useEffect(() => { const checkIfCorrect = newData.map((data) => { return data.map((dataItems) => { return dataItems.map((tasks, i) => { // 获取task1数组第一个元素的键 console.log(Object.keys(tasks.task1[0])); // 或者遍历所有task下的元素键 Object.values(tasks).forEach(taskArr => { taskArr.forEach(item => { console.log(Object.keys(item)); }) }); }); }); }); }, [newData]);
另外注意:你嵌套了三层map,可以检查下newData的实际结构是否真的需要这么多层遍历——从当前输出看,tasks已经是最外层目标对象,可能newData多了两层不必要的数组包裹,可根据实际结构简化遍历逻辑。
内容的提问来源于stack exchange,提问作者BlackRain
相关产品推荐
相关产品推荐

