You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

遍历含嵌套项的混合数据触发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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 07:15:19