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?
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)]
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);
Si vous souhaitez conserver le trait de soulignement pour que votre fonction de prédicat puisse être plus flexible, voici 2 idées.
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;};
});
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
.
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);
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);
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)
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;
}
La solution la plus simple consiste à utiliser lodash:
npm install --save lodash
const _ = require ('lodash');
findIndexByElementKeyValue = (elementKeyValue) => {
return _.findIndex(array, arrayItem => arrayItem.keyelementKeyValue);
}
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})
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);