0

次のコードは、配列内包表記と反復子/生成子を使用した Firefox 固有の JavaScript 1.7 実装を参照しています。この投稿の執筆時点では、'Iterator'、'yield'、および配列内包表記は Webkit ブラウザー (Chrome、Safari) ではまだサポートされておらず、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 と比較してください。配列です。

パイソン:

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

問題は、Python から JavaScript 関数に移植しようとしているときに、なぜ Iterator() と iter() が同じことをしないのかということです。

4

1 に答える 1

0

答え:

コードを Python 関数/ライブラリから JavaScript に移植するために、 Iterator() と 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);
//[['foo':5],['bar':10]]

ただし、items(myobject) の反復子を作成するときは、実際にはリストを反復処理しているため、Python の機能を再現するために 2 番目のインデックスのみを生成するカスタム ジェネレーターを作成する必要があります。

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

したがって、最終的には、何を反復しているかに注意して、互いに逆になる関数の呼び出しを回避することで、呼び出しを高速化できるかどうかを確認してください。

これがすべて事実に基づいていることを願っています。間違っている場合は訂正してください。

于 2012-08-31T14:31:13.813 に答える