IndexOf (objet) dans javascript

Erreur dans le code suivant: –

var x = [{id: 'abc'}, {id: 'xyz'}]; var index = x.indexOf({id: 'abc'}); 

Quelle est la syntaxe ci-dessus?

Les objets ne sont égaux que s'ils font référence à la même instance exacte de l'objet.

Vous devriez mettre en œuvre votre propre fonction de recherche. Par exemple:

 Array.prototype.indexOfObject = function(obj) { var l = this.length, i, k, ok; for( i=0; i<l; i++) { ok = true; for( k in obj) if( obj.hasOwnProperty(k)) { if( this[i][k] !== obj[k]) { ok = false; break; } } if( ok) return i; } return -1; // no match }; var x = [{id: 'abc'}, {id: 'xyz'}]; var index = x.indexOfObject({id: 'abc'}); // 0 

Vous devez passer la référence exactement au même objet que vous avez défini dans le tableau:

 var a = {id: 'abc'}, b = {id: 'xyz'}; var index = [a, b].indexOf(a); // 0 

Marco d'établissements d'hinquidence illustréesad Marco illustrddMachelMachachachachachachachachachinadachachachachachéeseaeaeaAachaseaach

Underscore.js fournit where , qui est également assez facile à écrire en JS pur:

 Array.prototype.where = function(props) { return this.filter(function(e) { for (var p in props) if (e[p] !== props[p]) return false; return true; }); } 

Une autre fonction (plus souple) comprend un objet ou une fonction en tant que sélecteur:

 Array.prototype.indexBy = function(selector) { var fn = typeof selector == "function" ? selector : function(elem) { return Object.keys(selector).every(function(k) { return elem[k] === selector[k] }) } return this.map(fn).indexOf(true); } 

et alors

 var x = [{id: 'abc'}, {id: 'xyz'}]; x.indexBy({'id': 'xyz'}) // works x.indexBy(function(elem) { return elem.id == 'xyz' }) // works too 

Voici la méthode la plus merveilleuse:

 var indexId = x.map(function(e) { return e.id; }).indexOf('abc'); 

Comme on l'a vu dans cette réponse

 var o = {} var x = [o] console.log(x.indexOf(o)) 

Avec x.indexOf({}) vous créez un nouvel objet qui n'est pas présent dans le tableau

Iterate à travers le tableau comme ceci:

 for(var i = 0, len = x.length; i < len; i++) { if (x[i].id === 'abc') { console.log(i); break; } } 

Sinon, vous devrez vous assurer que les pointeurs sont les mêmes pour les objets que vous essayez de rechercher avec indexOf