以下代码是指使用数组解析和迭代器/生成器的特定于Firefox的JavaScript 1.7实现。请注意,截至本文的撰写时,Webkit浏览器(Chrome,Safari)尚不支持“Iterator”,“yield”和数组理解,而且似乎只适用于Firefox的JavaScript引擎(Google,liberateme)。
注意:ECMAScript Harmony可能会对语法带来新的变化,并可能使这篇文章过时
var myobject = {'foo':5,'bar':10};
var myarray = [10,20,30];
for (var i in it) {
console.log(i);
}
//if var it = Iterator(myobject);
['foo',5]
['bar',10]
//if var it = Iterator(myarray);
[0,10]
[1,20]
[2,30]
似乎JS 1.7迭代器总是返回'key'和'value'(无论键是实际的对象键还是数组的索引。将此与Python对比,其中迭代器足够聪明,仅返回1值,如果它是一个数组。
#if it = iter(myobject);
[foo,5]
[bar,10]
#if it = iter(myarray);
10,
20,
30
所以问题是,当我尝试移植Python到JavaScript的函数时,Iterator()和iter()怎么不做同样的事情?
答案 0 :(得分:0)
为了将代码从Python函数/库移植到JavaScript,假设Iterator()和iter()执行相同的操作有点令人沮丧,只是意识到(它们稍有不同并导致开发人员有时必须使用自己的Iterator / Generator函数(使用'yield')*。
例如,假设我们想要滚动python的items()函数,该函数是dict对象的原生函数。var items = items = function(object) {
var list = [];
for (var i in object) {
list.push([i,object[i]]);
}
return list;
};
在传递 myobject JavaScript对象时,items()工作得很好(授予,我使用的是嵌套数组而不是元组)。
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))
所以最后,要小心你正在迭代的内容,看看你是否可以通过避免调用最终彼此反转的函数来加速你的调用。
我希望所有这些事实都是准确的 - 如果我错了,请纠正我。