saber repetidos objects index existe elementos elemento contar caracter cadena buscar array javascript

repetidos - javascript indexof array of objects



método de indexOf en una matriz de objetos? (27)

¿Cuál es el mejor método para obtener el índice de una matriz que contiene objetos?

Imagina este escenario:

var hello = { hello: ''world'', foo: ''bar'' }; var qaz = { hello: ''stevie'', foo: ''baz'' } var myArray = []; myArray.push(hello,qaz);

Ahora me gustaría tener el indexOf del objeto cuya propiedad hello es ''stevie'' que, en este ejemplo, sería 1 .

Soy bastante novato con JavaScript y no sé si hay un método simple o si debería crear mi propia función para hacerlo.


Breve

myArray.indexOf(''stevie'',''hello'')

Casos de uso:

/*****NORMAL****/ [2,4,5].indexOf(4) ;//OUTPUT 1 /****COMPLEX*****/ [{slm:2},{slm:4},{slm:5}].indexOf(4,''slm'');//OUTPUT 1 //OR [{slm:2},{slm:4},{slm:5}].indexOf(4,function(e,i){ return e.slm; });//OUTPUT 1 /***MORE Complex**/ [{slm:{salat:2}},{slm:{salat:4}},{slm:{salat:5}}].indexOf(4,function(e,i){ return e.slm.salat; });//OUTPUT 1

API:

Array.prototype.indexOfOld=Array.prototype.indexOf Array.prototype.indexOf=function(e,fn){ if(!fn){return this.indexOfOld(e)} else{ if(typeof fn ===''string''){var att=fn;fn=function(e){return e[att];}} return this.map(fn).indexOfOld(e); } };


Además de la respuesta de @Monika Garg , puede usar Array.prototype.findIndex (hay un polyfill para los navegadores sin soporte).

Vi que la gente votó a la baja esta respuesta, y espero que lo hayan hecho debido a la sintaxis incorrecta, porque en mi opinión, esta es la forma más elegante.

El método findIndex () devuelve un índice en la matriz, si un elemento de la matriz satisface la función de prueba provista. De lo contrario se devuelve -1.

Por ejemplo:

var hello = { hello: ''world'', foo: ''bar'' }; var qaz = { hello: ''stevie'', foo: ''baz'' } var myArray = []; myArray.push(hello,qaz); var index = myArray.findIndex(function(element) { return element.hello == ''stevie''; }); alert(index);


Comparé varios métodos y recibí un resultado con la forma más rápida de resolver este problema. Es un bucle for . Es 5+ veces más rápido que cualquier otro método.

Aquí está la página de la prueba: https://jsbench.me/9hjewv6a98


Creo que puedes resolverlo en una línea usando la función de map :

pos = myArray.map(function(e) { return e.hello; }).indexOf(''stevie'');


En ES2015, esto es bastante fácil:

myArray.map(x => x.hello).indexOf(''stevie'')

o, probablemente con un mejor rendimiento para matrices más grandes:

myArray.findIndex(x => x.hello === ''stevie'')


Esta es la manera de encontrar el índice del objeto en una matriz.

var myArray = [{ hello: ''world'', foo: ''bar'' },{ hello: ''stevie'', foo: ''baz'' }]; for (i = 0; i < myArray.length; i++) { if (myArray[i].hello === ''stevie'') { alert(''position: '' + i); return; } }


Esto funciona sin código personalizado.

var arr, a, found; arr = [{x: 1, y: 2}]; a = {x: 1, y: 2}; found = JSON.stringify(arr).indexOf(JSON.stringify(a)) > - 1; // found === true

Nota: esto no proporciona el índice real, solo indica si su objeto existe en la estructura de datos actual


He hecho una función genérica para verificar que a continuación se encuentra el código y funciona para cualquier objeto.

console.log(Object.keys({foo:"_0_", bar:"_1_"}).indexOf("bar"));

La primera alerta devolverá -1 (significa coincidencia no encontrada) y la segunda alerta devolverá 0 (significa coincidencia encontrada).


Hice algunas pruebas de rendimiento de varias respuestas aquí, que cualquiera puede ejecutar por sí mismo:

jsperf.com/find-index-of-object-in-array-by-contents

Según mis pruebas iniciales en Chrome, el siguiente método (el uso de un bucle for configurado dentro de un prototipo) es el más rápido:

Array.prototype.indexOfObject = function (property, value) { for (var i = 0, len = this.length; i < len; i++) { if (this[i][property] === value) return i; } return -1; } myArray.indexOfObject("hello", "stevie");

Este código es una versión ligeramente modificada de la respuesta de Nathan Zaetta.

En las pruebas de rendimiento, lo probé con el objetivo en el centro (índice 500) y muy al final (índice 999) de una matriz de 1000 objetos, e incluso si puse el objetivo como el último elemento de la matriz (lo que significa que tiene que recorrer cada elemento de la matriz antes de que se encuentre) todavía es el más rápido.

Esta solución también tiene la ventaja de ser una de las más concisas para la ejecución repetida, ya que solo se necesita repetir la última línea:

myArray.indexOfObject("hello", "stevie");


Me gusta la respuesta de Pablo, pero Array # indexOf y Array # map no funcionan en todos los navegadores. El subrayado utilizará el código nativo si está disponible, pero también tiene alternativas. Además, tiene el método de arrancar para hacer exactamente lo que hace el método de mapa anónimo de Pablo.

var idx = _.chain(myArray).pluck("hello").indexOf("Stevie").value();


Mientras que, la mayoría de las otras respuestas aquí son válidas. A veces, es mejor hacer una función corta y sencilla cerca de donde la usarás.

// indexOf wrapper for the list of objects function indexOfbyKey(obj_list, key, value) { for (index in obj_list) { if (obj_list[index][key] === value) return index; } return -1; } // Find the string in the list (default -1) var test1 = indexOfbyKey(object_list, ''name'', ''Stevie''); var test2 = indexOfbyKey(object_list, ''last_name'', ''some other name'');

Depende de lo que es importante para ti. Puede guardar líneas de código y ser muy inteligente para usar una sola línea, o para poner una solución genérica en algún lugar que cubra varios casos de borde. Pero a veces es mejor simplemente decir: "aquí lo hice así" en lugar de dejar que los futuros desarrolladores tengan un trabajo de ingeniería inversa adicional. Especialmente si te consideras "un novato" como en tu pregunta.


O prototipo:

Array.prototype.indexOfObject = function arrayObjectIndexOf(property, value) { for (var i = 0, len = this.length; i < len; i++) { if (this[i][property] === value) return i; } return -1; } myArr.indexOfObject("name", "stevie");


Preferiré usar el método findIndex() :

var index = myArray.findIndex(''hello'',''stevie'');

index le dará el número de índice.



Puede usar una función nativa y conveniente Array.prototype.findIndex() básicamente:

El método findIndex () devuelve un índice en la matriz, si un elemento de la matriz satisface la función de prueba provista. De lo contrario se devuelve -1.

Solo una nota que no es compatible con Internet Explorer, Opera y Safari, pero puede usar un Polyfill que se proporciona en el siguiente enlace.

Más información:

Array.prototype.findIndex

var hello = { hello: ''world'', foo: ''bar'' }; var qaz = { hello: ''stevie'', foo: ''baz'' } var myArray = []; myArray.push(hello, qaz); var index = myArray.findIndex(function(element, index, array) { if (element.hello === ''stevie'') { return true; } }); alert(''stevie is at index: '' + index);


Puedes crear tu propio prototipo para hacer esto:

algo como:

Array.prototype.indexOfObject = function (object) { for (var i = 0; i < this.length; i++) { if (JSON.stringify(this[i]) === JSON.stringify(object)) return i; } }


Si solo estás interesado en encontrar el puesto, consulta la respuesta de @Pablo .

pos = myArray.map(function(e) { return e.hello; }).indexOf(''stevie'');

Sin embargo, si está deseando encontrar el elemento (es decir, si estaba pensando en hacer algo como esto, myArray[pos] ), hay una forma más eficiente de hacerlo de una línea , utilizando el filter .

element = myArray.filter((e) => e.hello === ''stevie'')[0];

Ver resultados de rendimiento (~ + 42% ops / sec): http://jsbench.github.io/#7fa01f89a5dc5cc3bee79abfde80cdb3


Si su objeto es el mismo objeto de los que está utilizando dentro de la matriz, debería poder obtener el índice del Objeto de la misma manera que lo hace como si fuera una cadena.

var hello = { hello: ''world'', foo: ''bar'' }; var qaz = { hello: ''stevie'', foo: ''baz'' } var qazCLONE = { // new object instance and same structure hello: ''stevie'', foo: ''baz'' } var myArray = [hello,qaz]; myArray.indexOf(qaz) // should return 1 myArray.indexOf(qazCLONE) // should return -1


Usando el Array.prototype.findIndex ES6, sin lodash ni ninguna otra biblioteca, puede escribir:

function deepIndexOf(arr, obj) { return arr.findIndex(function (cur) { return Object.keys(obj).every(function (key) { return obj[key] === cur[key]; }); }); }

Esto comparará las propiedades inmediatas del objeto, pero no retrocederá en las propiedades.

Si su implementación aún no proporciona el findIndex (la mayoría no lo hace), puede agregar un polyfill ligero que admita esta búsqueda:

function deepIndexOf(arr, obj) { function findIndex = Array.prototype.findIndex || function (pred) { for (let i = 0; i < this.length; ++i) { if (pred.call(this, this[i], i)) { return i; } } return -1; } return findIndex.call(arr, function (cur) { return Object.keys(obj).every(function (key) { return obj[key] === cur[key]; }); }); }

(De mi respuesta en este dupe )


Usted puede simplemente utilizar

const someId = 2; const array = [{id:1}, {id:2}, {id:3}]; const index = array.reduce((i, item, index) => item.id === someId ? index : i, -1); alert(''someId '' + someId + '' is at index '' + index);

No hay subrayado, no para, solo una reducción.


Utilice _.findIndex de la biblioteca underscore.js

Aquí está el ejemplo _.findIndex([{a:1},{a: 2,c:10},{a: 3}], {a:2,c:10}) //1


Vea este ejemplo: http://jsfiddle.net/89C54/

function indexOfExt(list, item) { var len = list.length; for (var i = 0; i < len; i++) { var keys = Object.keys(list[i]); var flg = true; for (var j = 0; j < keys.length; j++) { var value = list[i][keys[j]]; if (item[keys[j]] !== value) { flg = false; } } if (flg == true) { return i; } } return -1; } var items = [{ "hello": ''world'', "foo": ''bar'' }]; var selectedItem = { "hello": ''world'', "foo": ''bar'' }; alert(items.indexOf(selectedItem)); alert(indexOfExt(items, selectedItem));

Comienza a contar con cero.


sencillo:

for (i = 0; i < myArray.length; i++) { if (myArray[i].hello === ''stevie'') { alert(''position: '' + i); return; } }


Array.prototype.findIndex es compatible con todos los navegadores que no sean IE (sin borde). Pero el polyfill proporcionado es agradable.

var indexOfStevie = myArray.findIndex(i => i.hello === "stevie");

La solución con mapa está bien. Pero estás iterando en toda la matriz en cada búsqueda. Ese es solo el peor de los casos para findIndex que detiene la iteración una vez que se encuentra una coincidencia.

Realmente no hay una forma concisa (cuando los desarrolladores tenían que preocuparse por IE8) , pero aquí hay una solución común:

var searchTerm = "stevie", index = -1; for(var i = 0, len = myArray.length; i < len; i++) { if (myArray[i].hello === searchTerm) { index = i; break; } }

o como una función:

function arrayObjectIndexOf(myArray, searchTerm, property) { for(var i = 0, len = myArray.length; i < len; i++) { if (myArray[i][property] === searchTerm) return i; } return -1; } arrayObjectIndexOf(arr, "stevie", "hello"); // 1

Solo algunas notas:

  1. No utilizar para ... en bucles en matrices
  2. Asegúrese de salir del bucle o volver a salir de la función una vez que haya encontrado su "aguja"
  3. Cuidado con la igualdad de objetos.

Por ejemplo,

var a = {obj: 0}; var b = [a]; b.indexOf({obj: 0}); // -1 not found


array.filter(function(item, indx, arr){ return(item.hello === ''stevie''); })[0];

Cuidado con el [0] .

Es apropiado usar reduce como en la respuesta de Antonio Laguna .

Disculpas por la brevedad ...


var hello = {hello: "world", foo: "bar"}; var qaz = {hello: "stevie", foo: "baz"}; var myArray = []; myArray.push(hello,qaz); function indexOfObject( arr, key, value ) { var j = -1; var result = arr.some(function(obj, i) { j++; return obj[key] == value; }) if (!result) { return -1; } else { return j; }; } alert(indexOfObject(myArray,"hello","world"));


var idx = myArray.reduce( function( cur, val, index ){ if( val.hello === "stevie" && cur === -1 ) { return index; } return cur; }, -1 );