javascript - objetos - encontrar el índice de matriz de un objeto con un valor clave específico en guión bajo
matriz javascript (9)
Manteniéndolo 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
O, para los que no lo odian, la variante de CoffeeScript:
findIndex = (arr, cond) ->
for i, x of arr
return parseInt(i) if cond(x)
En guión bajo, puedo encontrar con éxito un elemento con un valor clave específico
var tv = [{id:1},{id:2}]
var voteID = 2;
var data = _.find(tv, function(voteItem){ return voteItem.id == voteID; });
//data = { id: 2 }
pero ¿cómo puedo encontrar en qué índice de matriz se produjo ese objeto?
No sé si hay un método de guión bajo existente que hace esto, pero puede lograr el mismo resultado con 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;
}
Entonces puedes hacer:
var data = tv[tv.getIndexBy("id", 2)]
Si desea permanecer con guión bajo para que su función de predicado pueda ser más flexible, aquí hay 2 ideas.
Método 1
Dado que el predicado para _.find
recibe el valor y el índice de un elemento, puede usar efectos secundarios para recuperar el índice, como este:
var idx;
_.find(tv, function(voteItem, voteIdx){
if(voteItem.id == voteID){ idx = voteIdx; return true;};
});
Método 2
En cuanto a la fuente de subrayado, así es como _.find
se implementa:
_.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;
};
Para hacer de esto una función findIndex
, simplemente reemplace la línea result = value;
con result = index;
Esta es la misma idea que el primer método. Lo _.find
para señalar que el guión bajo usa efectos secundarios para implementar _.find
también.
Si esperas varias coincidencias y, por lo tanto, necesitas que se devuelva una matriz, prueba:
_.where(Users, {age: 24})
Si el valor de la propiedad es único y necesita el índice de la coincidencia, intente:
_.findWhere(Users, {_id: 10})
Si su entorno de destino es compatible con ES2015 (o tiene un paso de transpile, por ejemplo, con Babel), puede utilizar el Array.prototype.findIndex () nativo.
Dado tu ejemplo
const array = [ {id:1}, {id:2} ]
const desiredId = 2;
const index = array.findIndex(obj => obj.id === desiredId);
puede usar el método lodash
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);
Lo-Dash , que extiende Underscore, tiene el método lodash.com/docs#findIndex , que puede encontrar el índice de una instancia dada, o por un predicado dado, o según las propiedades de un objeto dado.
En tu caso, yo haría:
var index = _.findIndex(tv, { id: voteID });
Darle una oportunidad.
findIndex
fue agregado en 1.8:
index = _.findIndex(tv, function(voteItem) { return voteItem.id == voteID })
Ver: http://underscorejs.org/#findIndex
Alternativamente, esto también funciona, si no te importa hacer otra lista temporal:
index = _.indexOf(_.pluck(tv, ''id''), voteId);
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);