javascript - 关于 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() 不返回一个对象吗?
解决方案
为什么 for..in 循环不能处理对象,但 Set() 可以?Set() 不返回一个对象吗?
我认为您的意思是for...of
循环(这就是您的代码使用的),而不是for...in
.
要for...of
在某些东西上使用,它必须是可迭代的(它必须实现从中获取迭代器的标准方式)。默认情况下,对象不可迭代。Array
, Set
,Map
和String
对象是可迭代的,您可以制作自己的可迭代对象,但普通对象不可迭代。
我假设您正在使用Set
删除重复项("Burgers"
在 中出现两次flatmenus
)。您不需要该forEach
调用将值放入 中Set
,您可以直接flatmenus
传入new Set
:
for (let dish of new Set(flatmenus)) {
// ...
}
这是有效的,因为Set
构造函数接受一个可迭代对象并将其迭代器中的所有值添加到Set
. 数组是可迭代的。
推荐阅读
- vim - Vim autocmd 没有正确映射映射
- android - variant.getAssemble() 已过时并已替换为 variant.getAssembleProvider()
- java - 如何在 Android MVVM 架构中实现对话框选择选项
- c# - 如何修复 MVC 属性路由中的斜线“/”问题?
- android - 无法解析片段中的方法“recreate()”
- kotlin - 在 Kotlin 中使用 foreach 循环 BigInteger 值
- django - 如何在 Django 中的 mp3(媒体)请求上将标头“接受范围”设置为 HTTPResponse 中的字节
- python - python重命名子目录中的所有文件
- azure - 通过 powershell 创建日志警报规则并将多个操作组附加到该规则
- python-3.x - 当我使用 model.fit() 时出现 InvalidArgumentError