294 votes

Comment obtenir l'index d'un objet par sa propriété en JavaScript ?

Par exemple, j'ai :

var Data = [
  { id_list: 1, name: 'Nick', token: '312312' },
  { id_list: 2, name: 'John', token: '123123' },
]

Alors, je veux trier/renverser cet objet par name par exemple. Et puis je veux obtenir quelque chose comme ça :

var Data = [
  { id_list: 2, name: 'John', token: '123123' },
  { id_list: 1, name: 'Nick', token: '312312' },
]

Et maintenant je veux connaître l'index de l'objet avec la propriété name='John' pour obtenir la valeur du jeton de propriété.

Comment puis-je résoudre le problème ?

0 votes

Pourquoi voulez-vous d'abord trier la liste avant de rechercher le bien ?

0 votes

Les objets JavaScript sont {Key:Value} je l'ai réparé pour toi.

0 votes

1voto

Utilisez une petite solution de contournement :

Créez un nouveau tableau avec les noms comme index. Après cela, toutes les recherches utiliseront les index. Donc, une seule boucle. Après cela, vous n'aurez plus besoin de parcourir tous les éléments en boucle !

var Data = [
    {id_list:1, name:'Nick',token:'312312'},{id_list:2,name:'John',token:'123123'}
    ]
var searchArr = []
Data.forEach(function(one){
  searchArr[one.name]=one;
})
console.log(searchArr['Nick'])

http://jsbin.com/xibala/1/edit

Exemple concret.

0 votes

Cela signifie qu'il faut d'abord tout passer en boucle... puis modifier les objets (à moins de les cloner, mais cela représente encore plus de frais généraux). Et après cela, vous bouclez à nouveau (au moins partiellement).

1voto

Ed Shee Points 786

J'ai prolongé La réponse de Chris Pickett car dans mon cas, j'avais besoin d'effectuer une recherche plus profonde qu'un niveau d'attribut :

function findWithAttr(array, attr, value) {
  if (attr.indexOf('.') >= 0) {
    var split = attr.split('.');
    var attr1 = split[0];
    var attr2 = split[1];
    for(var i = 0; i < array.length; i += 1) {
      if(array[i][attr1][attr2] === value) {
        return i;
      }
    }
  } else {
    for(var i = 0; i < array.length; i += 1) {
      if(array[i][attr] === value) {
        return i;
      }
    }
  };
};

Vous pouvez passer 'attr1.attr2' dans la fonction.

1voto

Ellone Points 1314

Utilisez ça :

Data.indexOf(_.find(Data, function(element) {
  return element.name === 'John';
}));

Il suppose que vous utilisez Lodash o Underscore.js .

1voto

var fields = {
  teste:
  {
    Acess:
    {
      Edit: true,
      View: false
    }
  },
  teste1:
  {
    Acess:
    {
      Edit: false,
      View: false
    }
  }
};

console.log(find(fields,'teste'));

function find(fields,field) {
  for(key in fields) {
    if(key == field) {
      return true;
    }
  }
  return false;
}

Si vous avez un objet avec plusieurs objets à l'intérieur, si vous voulez savoir si certains objets sont inclus dans l'objet maître, utilisez simplement find(MasterObject, 'Object to Search') . Cette fonction renverra la réponse si elle existe ou non (VRAI ou FAUX). J'espère pouvoir vous aider - vous pouvez voir l'exemple sur JSFiddle .

1 votes

Ajoutez une explication à la réponse pour expliquer comment cette réponse aide le PO à résoudre le problème actuel.

0 votes

@K, Merci pour votre suggestion, j'ai déjà ajouté l'explication :)

1voto

Itay Merchav Points 1
let indexOf = -1;
let theProperty = "value"
let searchFor = "something";

theArray.every(function (element, index) {

    if (element[theProperty] === searchFor) {
        indexOf = index;
        return false;
    }
    return true;
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X