JavaScript1.7区分数组和对象的迭代程序
JavaScript 1.7 distinguish between Iterators of arrays and objects
以下代码引用了特定于Firefox的JavaScript1.7实现,该实现具有数组理解和迭代器/生成器。请注意,截至本文撰写之时,Webkit浏览器(Chrome、Safari)还不支持"Iterator"、"yield"和数组理解,似乎只能在Firefox的JavaScript引擎(Google、liberatme)上工作。
注意:ECMAScript Harmony可能会给语法带来新的变化,并可能使这个帖子过时
var myobject = {'foo':5,'bar':10};
var myarray = [10,20,30];
for (var i in it) {
console.log(i);
}
代码:
JavaScript:
//if var it = Iterator(myobject);
['foo',5]
['bar',10]
//if var it = Iterator(myarray);
[0,10]
[1,20]
[2,30]
看起来JS 1.7迭代程序总是返回一个"键"和一个"值"(无论键是实际的对象键还是数组的索引)。与Python相比,在Python中,迭代程序足够聪明,如果是数组,只返回1个值。
Python:
#if it = iter(myobject);
[foo,5]
[bar,10]
#if it = iter(myarray);
10,
20,
30
所以问题是,当我试图将Python移植到JavaScript函数时,Iterator()和iter()为什么不做同样的事情?
答案:
为了将代码从Python函数/库移植到JavaScript,假设Iterator()和iter()做同样的事情有点令人沮丧,但却意识到(它们略有不同,导致开发人员有时不得不滚动自己的Iterator/Generator函数(使用"yield")*。
例如,假设我们想要滚动dict对象所固有的python的items()函数。
var items = items = function(object) {
var list = [];
for (var i in object) {
list.push([i,object[i]]);
}
return list;
};
items()在向其传递myobjectJavaScript对象时工作得很好(当然,我使用的是嵌套数组而不是元组)。
items(myobject);
//[['foo':5],['bar':10]]
然而,当构建项的迭代器(myobject)时,我们实际上是在对列表进行迭代,因此我们希望制作一个只生成第二个索引的自定义生成器来重现Python的功能:
var arrayIterator = function(array){
for (var i in iter) {
yield i[1];//iterate over the non-index portion of the array iterable.
}
}
arrayIterator(items(myobject))
['foo',5]
['bar',10]
请注意,这里实际上有一些冗余。注意
Iterator(myobject) = arrayIterator(items(myobject))
所以最后,只要小心你正在迭代的内容,看看你是否可以通过避免调用最终彼此相反的函数来加快调用速度。
我希望所有这些都是事实上准确的——如果我错了,请纠正我。
- 如何在javascript中迭代数字列表
- JS:检查URL中的参数,然后迭代一个参数为var的函数
- 如何迭代Array.prototype函数
- 如何使用jquery迭代具有相同属性的html元素并查找onclick事件
- 在ejs-partial中对JSON对象进行迭代
- 如何在DataTables 2.1中迭代对象数组
- JavaScript1.7区分数组和对象的迭代程序
- JavaScript迭代程序
- 使用 Node.jS 驱动程序在 MongoDB 中迭代多个集合并比较结果
- 在 Angular 项目中迭代 JSON 响应以创建新的 $scope obj 我可以在应用程序中使用的
- 谷歌应用程序电子表格脚本;t总是完成迭代,否则效果良好
- 闭包(JS)迭代程序
- 迭代摘要应用程序Rally SDK
- 如何设置class=“;活动的”;当使用迭代生成N个选项卡(引导程序)时
- 在Ionic中,如何在for循环的每次迭代后向应用程序视图添加数据
- 当我在jQuery应用程序中迭代javascript字典的键时,我得到的是数字而不是值
- 量角器:如何迭代和比较从应用程序和场景表使用中继器得到的值
- 如何在React应用程序中隔离和迭代各个React组件
- Javascript:在for循环中定义的每个事件处理程序都是相同的,使用上次迭代的值
- jQuery/JavaScript:仅在循环的最后一次迭代期间分配的事件处理程序