【问题标题】:JavaScript 1.7 distinguish between Iterators of arrays and objectsJavaScript 1.7 区分数组和对象的迭代器
【发布时间】:2012-08-26 09:30:44
【问题描述】:

以下代码引用了 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 迭代器总是返回一个“键”和一个“值”(无论键是实际的对象键还是数组的索引。与 Python 相比,迭代器足够聪明,只返回 1如果是数组则为值。

Python:

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

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

【问题讨论】:

    标签: javascript firefox iterator


    【解决方案1】:

    答案:

    为了将代码从 Python 函数/库移植到 JavaScript,假设 Iterator() 和 iter() 做同样的事情有点令人沮丧,只是意识到(它们略有不同并导致开发人员有时不得不滚动他们自己的迭代器/生成器函数(使用 'yield')*。

    例如,假设我们想要滚动 python 的 items() 函数,该函数是 dict 对象的原生函数。

    var items = items = function(object) {
            var list = [];
            for (var i in object) {
                list.push([i,object[i]]);
            }
            return list;
        };
    

    items() 在传递 myobject JavaScript 对象时工作得很好(当然,我使用的是嵌套数组而不是元组)。

    items(myobject);
    //[['foo':5],['bar':10]]
    

    然而,在为 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))
    

    所以最后,请注意您正在迭代的内容,看看是否可以通过避免调用最终成为彼此相反的函数来加快调用速度。

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

    【讨论】:

      猜你喜欢
      • 2017-03-29
      • 2019-02-27
      • 2020-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-29
      • 2021-12-13
      相关资源
      最近更新 更多