最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - json index of property value - Stack Overflow

programmeradmin3浏览0评论

I need to get the index of the json object in an array whose by the objects id

here is the example code

var list = [ { _id: '4dd822c5e8a6c42aa70000ad',
    metadata: 
     { album: 'American IV: Man Comes Around',
       song: 'Hurt',
       coverart: '.jpeg',
       artist: 'Johnny Cash',
       length: 216,
       mnid: '44585439' } },
  { _id: '4dd80b16e8a6c428a900007d',
    metadata: 
     { album: 'OK Computer (Collector\'s Edition)',
       song: 'Paranoid Android',
       coverart: '.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: '.jpeg',
       artist: 'The Presidents Of The United States Of America',
       length: 134,
       mnid: '11698479' } }
]

then pseudo code

 var index_of  = list.indexOf("4dd80b16e8a6c428a900007d");

obviously that is not gonna work but I wonder if there is anyway to do this without looping to find the index ?

I need to get the index of the json object in an array whose by the objects id

here is the example code

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' } }
]

then pseudo code

 var index_of  = list.indexOf("4dd80b16e8a6c428a900007d");

obviously that is not gonna work but I wonder if there is anyway to do this without looping to find the index ?

Share Improve this question edited Apr 4, 2013 at 8:43 Mithun Satheesh 27.9k14 gold badges78 silver badges101 bronze badges asked Dec 21, 2011 at 4:29 mcgrailmmcgrailm 17.6k22 gold badges85 silver badges131 bronze badges
Add a comment  | 

6 Answers 6

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

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

You can try Array.prototype.map, based on your example it will be:

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

Array.prototype.map is not available on IE7 or IE8. ES5 Compatibility

Since there is no index of your data structure by _id, something is going to have to loop over the structure and find an _id value that matches.

function findId(data, id) {
    for (var i = 0; i < data.length; i++) {
        if (data[i]._id == id) {
            return(data[i]);
        }
    }
}

Just loop through the list until you find the matching id.

function indexOf(list, id) {
  for (var i = 0; i < list.length; i++) {
    if (list[i]._id === id) { return i; }
  }
  return -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'));

same as the above, but caches the length of the haystack.

a prototypical way

(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.
发布评论

评论列表(0)

  1. 暂无评论