2011-12-21 3 views
4

Iは、そのオブジェクトIDでここJSON指数

は、例えばコード

var list = [ { _id: '4dd822c5e8a6c42aa70000ad', 
    metadata: 
    { album: 'American IV: Man Comes Around', 
     song: 'Hurt', 
     coverart: 'http://images.mndigital.com/albums/044/585/435/m.jpeg', 
     artist: 'Johnny Cash', 
     length: 216, 
     mnid: '44585439' } }, 
    { _id: '4dd80b16e8a6c428a900007d', 
    metadata: 
    { album: 'OK Computer (Collector\'s Edition)', 
     song: 'Paranoid Android', 
     coverart: 'http://images.mndigital.com/albums/026/832/735/m.jpeg', 
     artist: 'Radiohead', 
     length: 383, 
     mnid: '26832739' } }, 
    { _id: '4dd68694e8a6c42c80000479', 
    metadata: 
    { album: 'The Presidents Of The United States Of America: Ten Year Super Bonus Special Anniversary Edition', 
     song: 'Lump', 
     coverart: 'http://images.mndigital.com/albums/011/698/433/m.jpeg', 
     artist: 'The Presidents Of The United States Of America', 
     length: 134, 
     mnid: '11698479' } } 
] 

次いで擬似コード

var index_of = list.indexOf("4dd80b16e8a6c428a900007d"); 
ある配列にJSONオブジェクトのインデックスを取得する必要が

明らかにそれはうまくいきませんが、インデックスを見つけるためにループせずにこれを行うにはどうしたらいいですか?

答えて

10
var i = list.length; 
while(i--) { 
    if(list[i]._id === '4dd80b16e8a6c428a900007d') break; 
} 

alert(i); // will be -1 if no match was found 
+1

うまくいっ!、 –

+0

元の質問はループなしで達成することでした。リストに100項目のインデックスを見つける必要がある場合はどうすればよいですか?私はこれをお勧めしません。 –

+0

@ShahAbazKhan:明らかに、ループを起こさずに指定された構造で行うことはできません。あなたのニーズがOPと異なる場合は、オブジェクトの配列をオブジェクトのIDのマップに変換するような別の方法を取ることになります。私はそれがここでどのように関連しているかはわかりません。 –

1

データ構造体のインデックスが_idであるため、構造体をループして一致する値が_idになることがあります。

function findId(data, id) { 
    for (var i = 0; i < data.length; i++) { 
     if (data[i]._id == id) { 
      return(data[i]); 
     } 
    } 
} 
1
あなたが一致するidを見つけるまでリストを

だけループ。

function indexOf(list, id) { 
    for (var i = 0; i < list.length; i++) { 
    if (list[i]._id === id) { return i; } 
    } 
    return -1; 
} 
1
function index_of(haystack, needle) { 
    for (var i = 0, l = haystack.length; i < l; ++i) { 
     if(haystack[i]._id === needle) { 
      return i; 
     } 
    } 
    return -1; 
} 

console.log(index_of(list, '4dd80b16e8a6c428a900007d')); 
上記と同様

、しかしは、干し草の山の長さをキャッシュします。

1

原型の方法

(function(){ 
    if (!Array.prototype.indexOfPropertyValue){ 
    Array.prototype.indexOfPropertyValue = function(prop,value){ 
     for (var index = 0; index < this.length; index++){ 
     if (prop in this[index]){ 
      if (this[index][prop] == value){ 
      return index; 
      } 
     } 
     } 
     return -1; 
    } 
    } 
})(); 
// usage: 

list.indexOfPropertyValue('_id','4dd80b16e8a6c428a900007d'); // returns 1 (index of array); 
list.indexOfPropertyValue('_id','Invalid id') // returns -1 (no result); 
var indexOfArray = list.indexOfPropertyValue('_id','4dd80b16e8a6c428a900007d'); 
list[indexOfArray] // returns desired object. 
5

あなたはあなたの例に基づいて、Array.prototype.mapを試すことができ、それは次のようになります。

var index = list.map(function(e) { return e._id; }).indexOf('4dd822c5e8a6c42aa70000ad'); 

Array.prototype.mapは、IE7やIE8には使用できません。 ES5 Compatibility

+0

これは私にとって最高の答えと思われる!あなたはあなたのデータの任意のポイントのインデックスとsubIndexを見つけることができます。 – BGecko