首页 > 解决方案 > 关于 Set() 和 for..in... in javascript

问题描述

function menuSet(menuArray) {
  let flatmenus = menuArray.flat();//Method gom cac Array con va Array cha thanh 1 Array duy nhat
  let combinedMenu = new Set();//Tao Object trong do Loai bo cac phan tu con trung nhau
  flatmenus.forEach(dish => { //Dua cac phan tu trong Flatmenus vao Object Set() moi duoc tao
    combinedMenu.add(dish)
  });
  const menuCombined = document.querySelector('#combined-menu')
  for (let dish of combinedMenu) {
    let foodNode = document.createElement('li')
    foodNode.innerText = dish;
    menuCombined.appendChild(foodNode);
  }
}
menuSet([["Tacos", "Burgers"], ["Pizza"], ["Burgers", "Fries"]])

为什么 for..in 循环不能处理对象,但 Set() 可以?Set() 不返回一个对象吗?

标签: javascript

解决方案


为什么 for..in 循环不能处理对象,但 Set() 可以?Set() 不返回一个对象吗?

我认为您的意思是for...of循环(这就是您的代码使用的),而不是for...in.

for...of在某些东西上使用,它必须是可迭代的(它必须实现从中获取迭代器的标准方式)。默认情况下,对象不可迭代。Array, Set,MapString对象是可迭代的,您可以制作自己的可迭代对象,但普通对象不可迭代。

我假设您正在使用Set删除重复项("Burgers"在 中出现两次flatmenus)。您不需要该forEach调用将值放入 中Set,您可以直接flatmenus传入new Set

for (let dish of new Set(flatmenus)) {
    // ...
}

这是有效的,因为Set构造函数接受一个可迭代对象并将其迭代器中的所有值添加到Set. 数组是可迭代的。


推荐阅读