【发布时间】:2018-02-19 21:54:47
【问题描述】:
如果数组本身是可迭代的,我无法理解为什么存在 array.entries?
如果我可以使用带有简单数组的可迭代消费者(例如 [1, 2, 3]),那么为什么需要将数组转换为数组迭代器?
我想不出这个函数在现实世界中有用的任何例子。请有人提供一个示例,说明可能在哪里使用 array.entries() 以及为什么?
【问题讨论】:
标签: javascript arrays iterator
如果数组本身是可迭代的,我无法理解为什么存在 array.entries?
如果我可以使用带有简单数组的可迭代消费者(例如 [1, 2, 3]),那么为什么需要将数组转换为数组迭代器?
我想不出这个函数在现实世界中有用的任何例子。请有人提供一个示例,说明可能在哪里使用 array.entries() 以及为什么?
【问题讨论】:
标签: javascript arrays iterator
Array.prototype.entries() 方法允许您使用 Iterator 对象,就像您已经正确指出的那样。
主要方面是您可以使用例如.next() 方法。您可以在MDN JavaScript documentation 中阅读有关迭代器和可迭代对象的更多信息。如果您想在不使用循环的情况下循环遍历数组,这将特别有用。
它还为您提供了制作像这样的无限迭代器的可能性:
var ids = {
*[Symbol.iterator]: function () {
var index = 0;
return {
next: function () {
return { value: 'id-' + index++, done: false };
}
};
}
};
var counter = 0;
for (var value of ids) {
console.log(value);
if (counter++ > 1000) { // let's make sure we get out!
break;
}
}
【讨论】:
使用迭代器对象最重要的方面是您可以更好地控制迭代器对象的循环。
示例 你有一个数组
let userName = ["John", "Sam", "Michael"];
您希望在开始时仅向用户显示第一个用户名 (John),但之后,您提供了用户单击显示下一个用户名 (Sam) 的按钮的功能。
所以如果它是一个迭代器对象,你有 .next() 方法,可以在每次用户点击时调用,并在交互中提供一个值 next,因为它会记住前一个指针。
let iteratorUserName = userName.entries();
用户点击的按钮
button.onclick = () => {
let nextUserName = iteratorUserName.next();
if(!nextUserName.done) {
return nextUserName.value;
} else {
alert("No User");
}
}
【讨论】:
例如:
var iter = [].entries.call("stackoverflow")
iter.next(); // { value: [0, "s"], done: false }
iter.next(); // { value: [1, "t"], done: false }
...
适用于任何类似数组的对象,例如字符串和节点列表。它可能不是最重要的功能,但拥有它并没有什么坏处。
【讨论】:
我喜欢
for(const [i,v] of [1,2,3].entries()) alert(i,v);
【讨论】: