2012-01-13 4 views
6

array.indexOf()のクロスブラウザの互換性が悪いことに気づいていませんでした。しかし、私は今、前の方法を使わずに同じことを達成する方法を見つける必要があります。crossbrowser "inArray"関数(jQueryなし)

私はしばらくの間、グーグルを試みましたが、本当の説得力のある答えは見つかりませんでした。私はjQueryのまたは任意の他のライブラリ/フレームワークを使用することはできません

  • :今のところ、私はループ(これは遅いですし、私はより良い方法があると確信しています)

    サイドノートでそれをやっています。

  • それは必ずしもどのように、アレイ・ループチェック指数(偽/単に真 OKになります)私はあなたのすべてを知っているので、私のコードを共有する必要はありませんと思っ

を返却する必要はありません。あなたは何をすべきかに関係なく今の

+0

Mozillaが提供する['indexOf' shim](https://developer.mozilla.org/ja/JavaScript/Reference/Global_Objects/Array/indexOf#Compatibility)を使用できます。 –

+0

「IE lt 9」に[ES5-shim](https://github.com/kriskowal/es5-shim)を指定したい場合... –

+0

ループはまったく悪くありません。 [V8の 'indexOf'もまた1つになっている。](http://www.google.com/codesearch#OAMlx_jo-ck/src/var/src/array.js&l=1207) – pimvdb

答えて

6

への力のための符号なしシフトこれはInArrayバリはjQueryのに実装されている方法ですされています

function inArray(elem, array, i) { 
    var len; 
    if (array) { 
     if (array.indexOf) { 
      return array.indexOf.call(array, elem, i); 
     } 
     len = array.length; 
     i = i ? i < 0 ? Math.max(0, len + i) : i : 0; 
     for (; i < len; i++) { 
      // Skip accessing in sparse arrays 
      if (i in array && array[ i ] === elem) { 
       return i; 
      } 
     } 
    } 
    return -1; 
} 

あなたはjQueryのを使用することはできませんが、なぜ実装を使用しないでください。 :-)

よろしくお願いします!

+1

最も可能性が高いのは、彼の先生彼が自分のコードを思いつくようにしていました。 – kennebec

+1

@kennebec私は自分の先生です(私は自分自身と趣味で勉強します) – mithril333221

1

(プラスそれはあなたのIQが低下します)のように見える、私はループでそれをやっている(しかし、これは遅いですし、私はより良い方法があると確信しています)

、それはdの終わりになりますループに巻き込まれるあなたが配列の中で検索するためのO(1)アルゴリズムを発明していない限り。ループを使用して対応する要素を見つけることには何も問題ありません。このメソッドで組み込みの配列オブジェクトを拡張して、再利用できるようにすることもできます。

2

MDNから:

if (!Array.prototype.indexOf) { 
    Array.prototype.indexOf = function (searchElement /*, fromIndex */) { 
     "use strict"; 
     if (this == null) { 
      throw new TypeError(); 
     } 
     var t = Object(this); 
     var len = t.length >>> 0; 
     if (len === 0) { 
      return -1; 
     } 
     var n = 0; 
     if (arguments.length > 0) { 
      n = Number(arguments[1]); 
      if (n != n) { // shortcut for verifying if it's NaN 
       n = 0; 
      } else if (n != 0 && n != Infinity && n != -Infinity) { 
       n = (n > 0 || -1) * Math.floor(Math.abs(n)); 
      } 
     } 
     if (n >= len) { 
      return -1; 
     } 
     var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0); 
     for (; k < len; k++) { 
      if (k in t && t[k] === searchElement) { 
       return k; 
      } 
     } 
     return -1; 
    } 
} 

これは、ネイティブ実装を見れば、それを実装しない場合はチェックします。

特筆すべきに関する注意点:

t.length >>> 0;はここで正の数

関連する問題