recorrer objetos matriz especifico eliminar elementos elemento buscar asociativos asociativo array agregar javascript underscore.js

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.



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);