JavaScript1.7区分数组和对象的迭代程序

JavaScript 1.7 distinguish between Iterators of arrays and objects

本文关键字:迭代 程序 对象 7区 数组 JavaScript1      更新时间:2023-09-26

以下代码引用了特定于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))

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

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