2013-03-14 14 views
36

私はjQueryに頼ることからAngularJSのアプリケーションを構築することに移行しています。 number of placesではなく、 mix jQueryとAngular codeが推奨されます。私も欠場

ことの一つは、配列のためのjQueryの$ .MAP機能です。私はこれがネイティブのJavaScriptのmap functionを使って書き直されていることは知っていますが、これはすべてのブラウザ(特にIE < v9)では実装されていません。

ので、角度相当するものはあり、または私はそう、私はjQueryのを含め停止することができますバックライティングfor (var x = 0; x < foo; x += 1) {...}になったでしょうか?

更新日時々、何を検索するか知っているだけで、必要なものすべてです。 Bergieは「ポリフィルを探す」と言います。ここでは古いブラウザ上で近代的なコードを機能させるための資源の束のための(Modernizrクルーから)リファレンスガイドです:ここHTML5 Cross Browser Polyfills

+1

ES5ポリフィルを含めることができます。これらは、配列の反復処理機能に対して単純で正確です。 – Bergi

+5

AngularはJSライブラリではありません。これは、単一ページのアプリケーションを構築するためのフレームワークです。少数のユーティリティ機能([angular.forEach](http://docs.angularjs.org/api/angular.forEach)を参照)がありますが、低レベルのJS操作を処理する方法は教えていません。それはLo-Dash/Underscoreと友人のためのものです。 – Stewie

+0

@Stewieが言及したことに加えて、Angularは実際にjqueryの束を投げ捨ててJQLiteと呼んだので、あなたが好きかどうかにかかわらず、Angularを使うときはjqueryがたくさんあります。それを使うこともできる。 Angularのようなものにはまだ多くの無駄がありますが、存在すればjqueryを利用する方が良いでしょう。 http://docs.angularjs.org/api/angular.element –

答えて

26

チェック:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/map

Mozillaがサポートされていないブラウザ

ためArray.mapのポリフィルを供給しています
if (!Array.prototype.map) { 
    Array.prototype.map = function(callback, thisArg) { 

    var T, A, k; 

    if (this == null) { 
     throw new TypeError(" this is null or not defined"); 
    } 

    // 1. Let O be the result of calling ToObject passing the |this| value as the argument. 
    var O = Object(this); 

    // 2. Let lenValue be the result of calling the Get internal method of O with the argument "length". 
    // 3. Let len be ToUint32(lenValue). 
    var len = O.length >>> 0; 

    // 4. If IsCallable(callback) is false, throw a TypeError exception. 
    // See: http://es5.github.com/#x9.11 
    if (typeof callback !== "function") { 
     throw new TypeError(callback + " is not a function"); 
    } 

    // 5. If thisArg was supplied, let T be thisArg; else let T be undefined. 
    if (thisArg) { 
     T = thisArg; 
    } 

    // 6. Let A be a new array created as if by the expression new Array(len) where Array is 
    // the standard built-in constructor with that name and len is the value of len. 
    A = new Array(len); 

    // 7. Let k be 0 
    k = 0; 

    // 8. Repeat, while k < len 
    while(k < len) { 

     var kValue, mappedValue; 

     // a. Let Pk be ToString(k). 
     // This is implicit for LHS operands of the in operator 
     // b. Let kPresent be the result of calling the HasProperty internal method of O with argument Pk. 
     // This step can be combined with c 
     // c. If kPresent is true, then 
     if (k in O) { 

     // i. Let kValue be the result of calling the Get internal method of O with argument Pk. 
     kValue = O[ k ]; 

     // ii. Let mappedValue be the result of calling the Call internal method of callback 
     // with T as the this value and argument list containing kValue, k, and O. 
     mappedValue = callback.call(T, kValue, k, O); 

     // iii. Call the DefineOwnProperty internal method of A with arguments 
     // Pk, Property Descriptor {Value: mappedValue, : true, Enumerable: true, Configurable: true}, 
     // and false. 

     // In browsers that support Object.defineProperty, use the following: 
     // Object.defineProperty(A, Pk, { value: mappedValue, writable: true, enumerable: true, configurable: true }); 

     // For best browser support, use the following: 
     A[ k ] = mappedValue; 
     } 
     // d. Increase k by 1. 
     k++; 
    } 

    // 9. return A 
    return A; 
    };  
} 
+0

素晴らしい!直接とスポットに。 – Benmj

+1

OPに質問の同じページへのリンクがありますが、パッチが表示されない可能性がありますか? –

+0

@thesystem:私は急いでそれを覆したことを認めます。 – Benmj

13

いや、角には同等ではありません。そしてあなたが発見したように、命令コードを書くことに回帰する必要はありません。

代わりに、ただのJavaScriptに直接組み込まれmap関数を使用します。 IE8をサポートする必要がある場合は、スクリプトの先頭にpolyfillを挿入します。