我有一个类似于下面的数据 struct ;我只是列出了项,但是,有些项具有嵌套项.出于这个问题的目的,我将具有嵌套对象的对象称为"段".

data = [
  {title: "Section 1", items: [{id: "1"}, {id: "2"}]},
  {title: "Section 2", items: [{id: "3"}, {id: "4"}]},
  {id: "5"},
  {id: "6"},
  {id: "7"},
]

我正在try 遍历"部分"中的项,然后再循环其余的项,但是,我得到了上面的错误.

try 1:

function addIsFavourite(favourites = [], sections) {
  for (const section of sections) {
    if ("items" in section) {
      // Section has nested items
      for (const item of section.items) {
        item.isFavourite = favourites.includes(item.id);
      }
    } else {
      // Section holds items directly
      for (const item of section) {
        item.isFavourite = favourites.includes(item.id);
      }
    }
  }
  return sections;
}

返回错误

[TypeError:迭代器方法不可调用]

try 2:

function addIsFavourite(favourites = [], 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;
}

这只适用于第一个"部分".

推荐答案

您遇到的错误表明您正试图迭代一个没有可调用迭代器方法的对象.在您的代码中,您似乎假设Section既可以是对象,也可以是数组,但您需要以不同的方式处理这两种情况.

下面是修改后的代码版本,它在try 覆盖section的项之前判断section是否是数组:

const data = [
      { title: "Section 1", items: [{ id: "1" }, { id: "2" }] },
      { title: "Section 2", items: [{ id: "3" }, { id: "4" }] },
      { id: "5" },
      { id: "6" },
      { id: "7" },
    ];
    
    const favourites = ["1", "4", "6"];
    
    function addIsFavourite(favourites = [], sections) {
      for (let section of sections) {
        if ("items" in section) {
          // Section has nested items
          for (let item of section.items) {
            item.isFavourite = favourites.includes(item.id);
          }
        } else if (Array.isArray(section)) {
          // Section holds items directly
          for (let item of section) {
            item.isFavourite = favourites.includes(item.id);
          }
        } else {
          // Section is a standalone item
          section.isFavourite = favourites.includes(section.id);
        }
      }
      return sections;
    }
    
    const result = addIsFavourite(favourites, data);
    
    console.log(result);

我希望这对你有用.

Javascript相关问答推荐

在分区内迭代分区

硬币兑换运行超时

从mat—country—select获取整个Country数组

基于变量切换隐藏文本

将状态向下传递给映射的子元素

按下同意按钮与 puppeteer 师

分层树视图

我的服务工作器没有连接到我的Chrome扩展中的内容脚本.我该怎么解决这个问题?

如何在Vue 3中创建自定义 Select 组件,并将选项作为HTML而不是props 传递?

这个值总是返回未定义的-Reaction

如何在文本字段中输入变量?

正则表达式,允许我匹配除已定义的子字符串之外的所有内容

闭包是将值复制到内存的另一个位置吗?

JavaScript不重定向配置的PATH

将范围 Select 器添加到HighChart面积图

用于部分字符串的JavaScript数组搜索

为什么NULL不能在构造函数的.Prototype中工作

react 路由DOM有条件地呈现元素

对不同目录中的Angular material 表列进行排序

JQuery使用选项填充HTMLSELECT并设置默认结果,默认结果显示为空