2011-11-29 9 views
30

のアレイ上の私のような配列がある場合:のJavascriptのindexOfオブジェクト

var myArray = [ 
       { 
        'color':'red', 
        'name': 'redName' 
       }, 
       { 
        'color':'blue', 
        'name': 'blueName' 
       }, 
       { 
        'color':'green', 
        'name': 'greenName' 
        }, 
       { 
        'color':'yellow', 
        'name': 'yellowName' 
       }, 
      ]; 

どのように私が言う、「青」の指標を得るのですか?

答えて

38
for(var i = 0; i < myArray.length; i++) { 
    if(myArray[i].color === 'blue') { 
    return i; 
    } 
} 

...でない「クリーン」な方法はありません。 Underscoreはこのようなもののための良いものです。

DEMO

Array.prototype.objIndexOf = function(val) { 
    var cnt =-1; 
    for (var i=0, n=this.length;i<n;i++) { 
     cnt++; 
     for(var o in this[i]) { 
     if (this[i].hasOwnProperty(o) && this[i][o]==val) return cnt; 
     } 
    } 
    return -1; 
} 
var myArray = [ 
       { 
        'color':'red', 
        'name': 'redName' 
       }, 
       { 
        'color':'blue', 
        'name': 'blueName' 
       }, 
       { 
        'color':'green', 
        'name': 'greenName' 
        }, 
       { 
        'color':'yellow', 
        'name': 'yellowName' 
       }, 
      ]; 
    alert(myArray.objIndexOf('blue')) 
+0

この回答のリンクは今すぐ壊れています。 –

+0

@AndersonGreen修正、ありがとうございました!また、この答えはかなり古いです。私は今ロダシュをお勧めします。 ES5は、Arrayプロトタイプへの固有のfind()実装も提供します。 –

0

配列全体を繰り返し、各要素オブジェクト内の値を探します。生のJavaScriptはあなたに多くのことを働かせるわけではありません。

+0

...多次元配列のindexOfはありません。 – redconservatory

+2

@redconservatoryそれは、多次元配列ではありません。しかし、そうではありません。配列プロトタイプに追加することができる実装はたくさんありますが、手動で行うこともできます。 –

+0

ありません。しかし、私はちょうどここに何かがあることを確認したいです...あなたの質問は、phpのarray_search()のような値のキーを検索することです。しかし、 "indexOf"は、文字列が別の文字列内にあるかどうかを調べる(そして発生位置を返す)という点で、phpのstrpos()によく似ています。 –

9

これは多次元配列ではなく、多次元配列ではなく、Javascriptで多次元配列の代わりに使用されます。存在しないためです。それはオブジェクトの配列です。配列内の項目を

あなたがすることができますループ:

var index; 
for (var i = 0; i < myArray.length; i++) { 
    if (myArray[i].color == 'blue') { 
    index = i; 
    break; 
    } 
} 

今変数indexはあなたの特定の例では、値1が含まれています。

+0

配列の良いレッスン...ありがとう。 – redconservatory

2

"1"を返すようにあなたの例から推測していますか?あなたは、サードパーティのライブラリーが関与する場合を除き、ここにあなたのための機能が

<script type='text/javascript'> 
var myArray = [ 
       { 
        'color':'red', 
        'name': 'redName' 
       }, 
       { 
        'color':'blue', 
        'name': 'blueName' 
       }, 
       { 
        'color':'green', 
        'name': 'greenName' 
        }, 
       { 
        'color':'yellow', 
        'name': 'yellowName' 
       }, 
      ]; 
function getIndexOf(a,v) { 
    var l = a.length; 
    for (var k=0;k<l;k++) { 
    if (a[k].color==v) { 
     return k; 
     } 
    }      
    return false; 
} 

alert (getIndexOf(myArray,'blue')); 
</script> 
2

myArray 
    .map(function (element) {return element.color;}) 
    .indexOf('blue'); 

注これらへの支援という関数は非常に限られています(Internet Explorer 8では動作しません)。あなたが将来的にいる、とあなたはES6を使用している場合は、あなたがそれを行うことができます。また

、:

myArray.map((el) => el.color).indexOf('blue'); 

上記と同じですが、小さいです。

+0

-1あなたは1年前の答え – qodeninja

+0

のようなネイティブのjavascriptオブジェクトを拡張してはいけません。そして、あなたはdownvoteを気にします。 Shees。 http://stackoverflow.com/questions/8859828/javascript-what-dangers-are-in-extending-array-prototype MDNのために十分ですが、十分です:https://developer.mozilla.org/en- – mplungjan

+1

haha​​私は実際には0になっていたので、実際には使用しませんでした。1年後、この質問はまだ私が探していたものと関連がありました。 – qodeninja

38

あなたはすでにあなたがそれを使用することができ、あなたのコード内でのECMAScript 5を使用している場合:このような例

+0

これはエレガントな解決策です – DariusVE

+2

"あなたが未来の場合は"名誉です! – Madivad

+0

それは素晴らしい仕事です –

12

私はこれがスーパー古いです知っているが、JavascriptをES6は素晴らしい方法Array.prototype.findIndex()を持っているので、あなただけ行うことができます:

let index = myArray.findIndex((item) => item.color === 'blue'); 
// value of index will be "1" 
+0

perfec answert !!! – SagarPPanchal

-1

あなたはあなたのケースでは

var findeMe = "blue"; 
myArray.findIndex(function(row){ 
return row.color == findMe; 
}); 

.findIndex() method

を使用することができます私はそれが助けて欲しい。