遍历含嵌套项的混合数据触发TypeError: iterator method is not callable
解决混合数据结构中添加isFavourite属性的问题
问题场景
现有如下混合结构的数组:部分元素是包含items嵌套数组的section对象,其余是普通的item对象。需要实现addIsFavourite函数,遍历所有item并根据favourites数组为每个item添加isFavourite属性。
原始数据结构:
const data = [ {title: "Section 1", items: [{id: "1"}, {id: "2"}]}, {title: "Section 2", items: [{id: "3"}, {id: "4"}]}, {id: "5"}, {id: "6"}, {id: "7"}, ]
尝试方案的错误分析
Attempt 1 错误原因
function addIsFavourite(favourites = [], sections) { for (const section of sections) { if ("items" in section) { for (const item of section.items) { item.isFavourite = favourites.includes(item.id); } } else { // 这里出错:普通item是单个对象,不是可迭代数组,不能用for...of遍历 for (const item of section) { item.isFavourite = favourites.includes(item.id); } } } return sections; }
当遍历到普通item(比如{id: "5"})时,进入else分支尝试用for...of遍历这个对象,但普通对象不是可迭代类型,直接触发TypeError: iterator method is not callable错误。
Attempt 2 错误原因
function addIsFavourite(favourites = [], sections) { // 这里判断逻辑错误:sections是整个数组,不是单个元素 if ("items" in sections) { for (const section of sections) { for (const item of section.items) { item.isFavourite = favourites.includes(item.id); } } } else { for (const item of sections) { item.isFavourite = favourites.includes(item.id); } } return sections; }
函数开头错误地判断"items" in sections,但sections是传入的整个数组,不是单个元素。如果数组第一个元素是section,这个判断不成立,会进入else分支遍历整个数组,导致section里的嵌套item没被处理;反之如果第一个元素是普通item,会进入if分支但遍历数组时普通item没有items属性,又会报错。最终只会处理部分元素,逻辑完全错误。
正确实现方案
核心逻辑:遍历数组中的每个元素,逐个判断是否为section(存在items属性):
- 如果是section:遍历其
items数组,给每个item添加isFavourite - 如果是普通item:直接给当前元素添加
isFavourite
代码实现:
function addIsFavourite(favourites = [], sections) { // 遍历数组中的每个元素 for (const element of sections) { if ("items" in element) { // 处理section中的嵌套items element.items.forEach(item => { item.isFavourite = favourites.includes(item.id); }); } else { // 处理普通item element.isFavourite = favourites.includes(element.id); } } return sections; } // 测试示例 const favourites = ["2", "5", "7"]; const result = addIsFavourite(favourites, data); console.log(result);
测试后会看到所有item都正确添加了isFavourite属性:
- Section1中的item2为true,item1为false
- Section2中的item3、4都是false
- 普通item5、7为true,item6为false
内容的提问来源于stack exchange,提问作者David Henry
相关产品推荐
相关产品推荐

