JavaScript 1.7区分数组和对象的迭代器

时间:2012-08-31 14:31:14

标签: javascript firefox iterator

以下代码是指使用数组解析和迭代器/生成器的特定于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);
}

代码:

的JavaScript:

//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值,如果它是一个数组。

的Python:

#if it = iter(myobject);
[foo,5]
[bar,10]
#if it = iter(myarray);
10,
20,
30

所以问题是,当我尝试移植Python到JavaScript的函数时,Iterator()和iter()怎么不做同样的事情?

1 个答案:

答案 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))

所以最后,要小心你正在迭代的内容,看看你是否可以通过避免调用最终彼此反转的函数来加速你的调用。

我希望所有这些事实都是准确的 - 如果我错了,请纠正我。