recorrer objetos objeto metodos eliminar elementos elemento diccionario buscar array agregar javascript arrays

objetos - ¿Cómo determinar si la matriz de Javascript contiene un objeto con un atributo que es igual a un valor dado?



metodos javascript (16)

Tengo una matriz como

vendors = [ { Name: ''Magenic'', ID: ''ABC'' }, { Name: ''Microsoft'', ID: ''DEF'' } and so on... ];

¿Cómo verifico esta matriz para ver si Magenic existe? No quiero hacer un bucle, a menos que tenga que hacerlo. Estoy trabajando con potencialmente un par de miles de discos.

ACTUALIZADO

Ya que esta ha sido una publicación popular, pensé en compartir algo nuevo que encontré. ¡Y parece que @CAFxX ya ha compartido esto! Debería leer esto más a menudo. Me encontré con https://benfrain.com/understanding-native-javascript-array-methods/ .

vendors.filter(function(vendor){ return vendor.Name === "Magenic" });

Y con ECMAScript 2015 es aún más sencillo con las nuevas funciones de flecha:

vendors.filter(vendor => (vendor.Name === "Magenic"));


A menos que quieras reestructurarlo así:

vendors = { Magenic: { Name: ''Magenic'', ID: ''ABC'' }, Microsoft: { Name: ''Microsoft'', ID: ''DEF'' } and so on... };

a lo que puedes hacer if(vendors.Magnetic)

Tendrá que hacer un bucle


Alternativamente puedes hacer:

const find = (key, needle) => return !!~vendors.findIndex(v => (v[key] === needle));


Como el OP ha hecho la pregunta si la clave existe o no . La solución propuesta devolverá una matriz con el objeto o una matriz vacía si usamos arr.filter como se propone en varias soluciones anteriores.

Una solución más elegante que devolverá el valor booleano utilizando la función de filtro ES6 puede ser

const magenicVendorExists = !!vendors.filter(vendor => (vendor.Name === "Magenic"));

Nota: ¡ El primero ! convertirá la matriz vacía a verdadero y una matriz con objeto a falso. Por lo tanto un ! en adelante revertirá el booleano.

Espero que sirva para una mejor y más limpia implementación del código.


Corríjame si me equivoco ... podría haber usado para forEach método como este,

var found=false; vendors.forEach(function(item){ if(item.name === "name"){ found=true; return; } });

Hoy en día estoy acostumbrado, por su sencillez y su palabra autoexplicativa. Gracias.


De acuerdo con la especificación ECMAScript 6, puede utilizar findIndex .

const magenicIndex = vendors.findIndex(vendor => vendor.Name === ''Magenic'');

magenicIndex mantendrá 0 (que es el índice en la matriz) o -1 si no se encontró.


La respuesta aceptada aún funciona, pero ahora tenemos un método nativo ECMAScript 6 [Array.find][1] para lograr el mismo efecto.

Cotizando MDN:

El método find () devuelve el valor del primer elemento de la matriz que satisface la función de prueba provista. De lo contrario se devuelve undefined.

var arr = []; var item = { id: ''21'', step: ''step2'', label: ''Banana'', price: ''19$'' }; arr.push(item); /* note : data is the actual object that matched search criteria or undefined if nothing matched */ var data = arr.find( function( ele ) { return ele.id === ''21''; } ); if( data ) { console.log( ''found'' ); console.log(data); // This is entire object i.e. `item` not boolean }

Ver mi enlace de jsfiddle. Hay un polyfill para IE provisto por mozilla


Muchas respuestas aquí son buenas y bastante fáciles. Pero si su conjunto de objetos tiene un conjunto fijo de valores, puede utilizar el siguiente truco:

Mapear todo el nombre en un objeto.

vendors = [ { Name: ''Magenic'', ID: ''ABC'' }, { Name: ''Microsoft'', ID: ''DEF'' } ]; var dirtyObj = {} for(var count=0;count<vendors.length;count++){ dirtyObj[vendors[count].Name] = true //or assign which gives you true. }

Ahora este dirtyObj puede usar una y otra vez sin ningún bucle.

if(dirtyObj[vendor.Name]){ console.log("Hey! I am available."); }


No hay bucle necesario. Tres métodos que vienen a la mente:

Array.prototype.some ()

Esta es la respuesta más exacta para su pregunta, es decir, "verificar si algo existe", lo que implica un resultado bool. Esto será cierto si hay algún objeto ''Magenic'', falso de lo contrario:

let hasMagenicVendor = vendors.some( vendor => vendor[''Name''] === ''Magenic'' )

Array.prototype.filter ()

Esto devolverá una matriz de todos los objetos ''Magenic'', incluso si solo hay uno (devolverá una matriz de un elemento):

let magenicVendors = vendors.filter( vendor => vendor[''Name''] === ''Magenic'' )

Si intentas forzar esto a un booleano, no funcionará, ya que una matriz vacía (sin objetos ''Magenic'') sigue siendo sincera. Así que solo usa magenicVendors.length en tu condicional.

Array.prototype.find ()

Esto devolverá el primer objeto ''Magenic'' (o undefined si no lo hay):

let magenicVendor = vendors.find( vendor => vendor[''Name''] === ''Magenic'' );

Esto obliga a un bien booleano (cualquier objeto es verdadero, undefined es falso).

Nota: Estoy usando el proveedor ["Nombre"] en lugar de vendor.Name debido a la extraña carcasa de los nombres de las propiedades.

Nota 2: No hay razón para usar la igualdad suelta (==) en lugar de la igualdad estricta (===) al verificar el nombre.


No hay necesidad de reinventar el rueda bucle, al menos no explícitamente (utilizando funciones de flecha , solo navegadores modernos ):

if (vendors.filter(e => e.name === ''Magenic'').length > 0) { /* vendors contains the element we''re looking for */ }

o, mejor aún :

if (vendors.some(e => e.name === ''Magenic'')) { /* vendors contains the element we''re looking for */ }

EDITAR: Si necesita compatibilidad con navegadores pésimos, su mejor apuesta es:

if (vendors.filter(function(e) { return e.name === ''Magenic''; }).length > 0) { /* vendors contains the element we''re looking for */ }


No hay una forma "mágica" de comprobar algo en una matriz sin un bucle. Incluso si usa alguna función, la función en sí usará un bucle. Lo que puede hacer es salir del ciclo tan pronto como encuentre lo que está buscando para minimizar el tiempo de cómputo.

var found = false; for(var i = 0; i < vendors.length; i++) { if (vendors[i].Name == ''Magenic'') { found = true; break; } }


No puedes sin mirar el objeto realmente.

Probablemente deberías cambiar un poco tu estructura, como

vendors = { Magenic: ''ABC'', Microsoft: ''DEF'' };

Entonces puedes usarlo como un hash de búsqueda.

vendors[''Microsoft'']; // ''DEF'' vendors[''Apple'']; // undefined


Prefiero ir con regex.

Si su código es el siguiente,

vendors = [ { Name: ''Magenic'', ID: ''ABC'' }, { Name: ''Microsoft'', ID: ''DEF'' } ];

yo recomendaria

/"Name":"Magenic"/.test(JSON.stringify(vendors))


Puedes usar lodash . Si la biblioteca de lodash es demasiado pesada para su aplicación, considere desactivar la función innecesaria no utilizada.

let newArray = filter(_this.props.ArrayOne, function(item) { return find(_this.props.ArrayTwo, {"speciesId": item.speciesId}); });

Esta es solo una forma de hacer esto. Otro puede ser:

var newArray= []; _.filter(ArrayOne, function(item) { return AllSpecies.forEach(function(cItem){ if (cItem.speciesId == item.speciesId){ newArray.push(item); } }) });

console.log(arr);

El ejemplo anterior también se puede reescribir sin usar bibliotecas como:

var newArray= []; ArrayOne.filter(function(item) { return ArrayTwo.forEach(function(cItem){ if (cItem.speciesId == item.speciesId){ newArray.push(item); } }) }); console.log(arr);

Espero que mi respuesta ayude.


Tienes que hacer un bucle, no hay manera de evitarlo.

function seekVendor(vendors, name) { for (var i=0, l=vendors.length; i<l; i++) { if (typeof vendors[i] == "object" && vendors[i].Name === name) { return vendors[i]; } } }

Por supuesto, puedes usar una biblioteca como linq.js para hacer esto más agradable:

Enumerable.From(vendors).Where("$.Name == ''Magenic''").First();

(ver jsFiddle para una demostración)

Dudo que linq.js sea más rápido que un bucle directo, pero ciertamente es más flexible cuando las cosas se complican un poco más.


si está utilizando jquery, puede aprovechar grep para crear una matriz con todos los objetos coincidentes:

var results = $.grep(vendors, function (e) { return e.Name == "Magenic"; });

y luego usar la matriz de resultados:

for (var i=0, l=results.length; i<l; i++) { console.log(results[i].ID); }


var without2 = (arr, args) => arr.filter(v => v.id !== args.id); Ejemplo:

without2([{id:1},{id:1},{id:2}],{id:2})

Resultado: without2 ([{id: 1}, {id: 1}, {id: 2}], {id: 2})