web-dev-qa-db-fra.com

rechercher l'index de tableau d'un objet avec une valeur de clé spécifique dans le trait de soulignement

En soulignement, je peux avec succès trouver un article avec une valeur de clé spécifique

var tv = [{id:1},{id:2}]
var voteID = 2;
var data = _.find(tv, function(voteItem){ return voteItem.id == voteID; });
//data = { id: 2 }

mais comment trouver quel index de tableau cet objet s'est produit?

76
mheavers

Je ne sais pas s'il existe une méthode de soulignement existante pour le faire, mais vous pouvez obtenir le même résultat avec du javascript simple.

Array.prototype.getIndexBy = function (name, value) {
    for (var i = 0; i < this.length; i++) {
        if (this[i][name] == value) {
            return i;
        }
    }
    return -1;
}

Ensuite, vous pouvez simplement faire:

var data = tv[tv.getIndexBy("id", 2)]

28
tewathia

findIndex a été ajouté dans 1.8:

index = _.findIndex(tv, function(voteItem) { return voteItem.id == voteID })

Voir: http://underscorejs.org/#findIndex

Alternativement, cela fonctionne aussi, si vous n’avez pas l’esprit de créer une autre liste temporaire:

index = _.indexOf(_.pluck(tv, 'id'), voteId);

Voir: http://underscorejs.org/#pluck

152
Ropez

Si vous souhaitez conserver le trait de soulignement pour que votre fonction de prédicat puisse être plus flexible, voici 2 idées.

Méthode 1

Puisque le prédicat pour _.find reçoit à la fois la valeur et l'index d'un élément, vous pouvez utiliser l'effet secondaire pour récupérer l'index, comme ceci:

var idx;
_.find(tv, function(voteItem, voteIdx){ 
   if(voteItem.id == voteID){ idx = voteIdx; return true;}; 
});

Méthode 2

En regardant source de soulignement, voici comment _.find est implémenté:

_.find = _.detect = function(obj, predicate, context) {
  var result;
  any(obj, function(value, index, list) {
    if (predicate.call(context, value, index, list)) {
      result = value;
      return true;
    }
  });
  return result;
};

Pour en faire une fonction findIndex, remplacez simplement la ligne result = value; par result = index;. C'est la même idée que la première méthode. Je l'ai inclus pour souligner que le trait de soulignement utilise un effet secondaire pour implémenter _.find.

37
lastoneisbearfood

Lo-Dash , qui étend Underscore, a la méthode findIndex , qui peut trouver l'index d'une instance donnée, d'un prédicat donné ou des propriétés d'un objet donné.

Dans votre cas, je ferais:

var index = _.findIndex(tv, { id: voteID });

Essaie.

33
splintor

Si votre environnement cible prend en charge ES2015 (ou si vous avez une étape de transposition, par exemple avec Babel), vous pouvez utiliser la méthode native Array.prototype.findIndex ().

Compte tenu de votre exemple

const array = [ {id:1}, {id:2} ]
const desiredId = 2;
const index = array.findIndex(obj => obj.id === desiredId);
8

vous pouvez utiliser la méthode indexOf à partir de lodash

var tv = [{id:1},{id:2}]
var voteID = 2;
var data = _.find(tv, function(voteItem){ return voteItem.id == voteID; });
var index=_.indexOf(tv,data);
4
Amil Sajeev

Keepin 'it simple:

// Find the index of the first element in array
// meeting specified condition.
//
var findIndex = function(arr, cond) {
  var i, x;
  for (i in arr) {
    x = arr[i];
    if (cond(x)) return parseInt(i);
  }
};

var idIsTwo = function(x) { return x.id == 2 }
var tv = [ {id: 1}, {id: 2} ]
var i = findIndex(tv, idIsTwo) // 1

Ou, pour les non-ennemis, la variante CoffeeScript:

findIndex = (arr, cond) ->
  for i, x of arr
    return parseInt(i) if cond(x)
3
joyrexus

Ceci est pour aider les utilisateurs lodash. vérifiez si votre clé est présente en faisant:

hideSelectedCompany(yourKey) {
 return _.findIndex(yourArray, n => n === yourKey) === -1;
}
0
Syed

La solution la plus simple consiste à utiliser lodash:

  1. Installez lodash:

npm install --save lodash

  1. Utilisez la méthode findIndex:

const _ = require ('lodash');

findIndexByElementKeyValue = (elementKeyValue) => {
  return _.findIndex(array, arrayItem => arrayItem.keyelementKeyValue);
}
0
Jackkobec

Si vous attendez plusieurs correspondances et que vous avez donc besoin d'un tableau à retourner, essayez:

_.where(Users, {age: 24})

Si la valeur de la propriété est unique et que vous avez besoin de l'index de la correspondance, essayez:

_.findWhere(Users, {_id: 10})
0
Ketan
Array.prototype.getIndex = function (obj) {
    for (var i = 0; i < this.length; i++) {
        if (this[i][Id] == obj.Id) {
            return i;
        }
    }
    return -1;
}

List.getIndex(obj);
0
Chinna Amara