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

JavaScript 1.7区分数组和对象的迭代器,javascript,firefox,iterator,Javascript,Firefox,Iterator,下面的代码引用了Firefox特定的JavaScript 1.7实现,其中包含数组理解和迭代器/生成器。请注意,在撰写本文时,“迭代器”、“产量”和数组理解在Webkit浏览器(Chrome、Safari)中还不受支持,而且似乎只在Firefox的JavaScript引擎(Google、LiberMe)上工作 注意:ECMAScript Harmony可能会对语法进行新的更改,并可能使本文过时 代码: JavaScript: JS 1.7迭代器似乎总是返回一个“键”和一个“值”(无论键是实际的对

下面的代码引用了Firefox特定的JavaScript 1.7实现,其中包含数组理解和迭代器/生成器。请注意,在撰写本文时,“迭代器”、“产量”和数组理解在Webkit浏览器(Chrome、Safari)中还不受支持,而且似乎只在Firefox的JavaScript引擎(Google、LiberMe)上工作

注意:ECMAScript Harmony可能会对语法进行新的更改,并可能使本文过时

代码: JavaScript: JS 1.7迭代器似乎总是返回一个“键”和一个“值”(无论键是实际的对象键还是数组的索引)。与此相比,Python的迭代器足够聪明,如果它是数组,则只返回1个值

蟒蛇: 所以问题是,当我尝试将Python移植到JavaScript函数时,为什么迭代器()和iter()不做相同的事情?

回答: 为了将代码从Python函数/库移植到JavaScript,假设迭代器()和iter()做同样的事情,但却认识到(它们略有不同,导致开发人员有时不得不滚动自己的迭代器/生成器函数(使用“yield”)*,这有点令人沮丧

例如,假设我们想要滚动dict对象固有的python的items()函数

var items = items = function(object) {
        var list = [];
        for (var i in object) {
            list.push([i,object[i]]);
        }
        return list;
    };
items()在传递myobject JavaScript对象时工作正常(当然,我使用的是嵌套数组而不是元组)

但是,在为items(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))
因此,最后,只需小心您正在迭代的内容,看看是否可以通过避免调用最终互为相反的函数来加快调用速度

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

var items = items = function(object) {
        var list = [];
        for (var i in object) {
            list.push([i,object[i]]);
        }
        return list;
    };
items(myobject);
//[['foo':5],['bar':10]]
    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))