Tengo una serie como
vendors = [
{
Name: 'Magenic',
ID: 'ABC'
},
{
Name: 'Microsoft',
ID: 'DEF'
} //and so on goes array...
];
¿Cómo verifico esta matriz para ver si existe Magenic? No quiero repetir, a menos que tenga que hacerlo. Estoy trabajando con potencialmente un par de miles de registros.
ACTUALIZADO
Como 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 simple usar las nuevas funciones de flecha:
vendors.filter(vendor => vendor.Name === "Magenic")
javascript
arrays
David Lozzi
fuente
fuente
Respuestas:
Edición de 2018 : esta respuesta es de 2011, antes de que los navegadores admitieran ampliamente los métodos de filtrado de matriz y las funciones de flecha. Echa un vistazo a la respuesta de CAFxX .
No hay una forma "mágica" de buscar algo en una matriz sin un bucle. Incluso si usa alguna función, la función misma usará un bucle. Lo que puede hacer es salir del ciclo tan pronto como encuentre lo que está buscando para minimizar el tiempo computacional.
fuente
'Magenic'
está en otro lugar del objetoNo es necesario reinventar el
ruedabucle, al menos no explícitamente (usando funciones de flecha , solo navegadores modernos ):o, mejor aún :
EDITAR: si necesita compatibilidad con navegadores malos, entonces su mejor opción es:
fuente
some
puede cortocircuitar una vez que se encuentra un objeto conname === "Magenic"
. Confilter
, verificará cada elemento hasta el final de la matriz y creará una nueva matriz de elementos que coincida con la condición, luego verificará ellength
No es necesario un bucle. Tres métodos que vienen a la mente:
Array.prototype.some ()
Esta es la respuesta más exacta para su pregunta, es decir, "verifique si algo existe", lo que implica un resultado bool. Esto será cierto si hay algún objeto 'Magenic', falso de lo contrario:
Array.prototype.filter ()
Esto devolverá una matriz de todos los objetos 'Magenic', incluso si solo hay uno (devolverá una matriz de un elemento):
Si intenta forzar esto a un valor booleano, no funcionará, ya que una matriz vacía (sin objetos 'Magenic') sigue siendo verdadera. Así que solo úsalo
magenicVendors.length
en tu condicional.Array.prototype.find ()
Esto devolverá el primer objeto 'Magenic' (o
undefined
si no hay ninguno):Esto coacciona a un booleano aceptable (cualquier objeto es verdadero,
undefined
es falso).Nota: Estoy usando vendor ["Name"] en lugar de vendor.Name debido a la extraña carcasa de los nombres de propiedad.
Nota 2: No hay razón para usar la igualdad suelta (==) en lugar de la igualdad estricta (===) al verificar el nombre.
fuente
La respuesta aceptada todavía funciona, pero ahora tenemos un método nativo ECMAScript 6
[Array.find][1]
para lograr el mismo efecto.Citando a MDN:
Ver mi enlace jsfiddle Hay un polyfill para IE proporcionado por mozilla
fuente
return ele.id == '2'
, pero +1 para una buena solución ES6.push if <0 || splice(index, 1)
aquí está mi código un poco actualizado:const index = this.selected.indexOf(this.selected.find(s => s.id == passedObj.id))
Así es como lo haría
array.some()
El método comprueba si hay al menos un valor en una matriz que coincida con los criterios y devuelve un valor booleano. De aquí en adelante puedes ir con:fuente
A menos que quieras reestructurarlo así:
a lo que puedes hacer
if(vendors.Magnetic)
Tendrás que hacer un bucle
fuente
Según la especificación ECMAScript 6, puede usar
findIndex
.const magenicIndex = vendors.findIndex(vendor => vendor.Name === 'Magenic');
magenicIndex
retendrá0
(que es el índice en la matriz) o-1
si no se encontró.fuente
Como el OP ha hecho la pregunta si la clave existe o no .
Una solución más elegante que devolverá un valor booleano utilizando la función de reducción ES6 puede ser
Nota: El parámetro inicial de reducir es a
false
y si la matriz tiene la clave, devolverá verdadero.Espero que ayude a una implementación de código mejor y más limpia
fuente
reduce
es el acumulador y no elvendor
objeto. Esto verificafalse.Name === "Magenic"
en cada bucle y devuelve falsoNo puedes sin mirar el objeto realmente.
Probablemente deberías cambiar un poco tu estructura, como
Entonces puedes usarlo como un hash de búsqueda.
fuente
Puede ser demasiado tarde, pero la matriz de JavaScript tiene dos métodos
some
y unevery
método que devuelve un valor booleano y puede ayudarlo a lograrlo.Creo que
some
sería más apropiado para lo que pretendes lograr.Algunos validan que cualquiera de los objetos en la matriz satisface la condición dada.
Cada valida que todos los objetos en la matriz satisfacen la condición dada.
fuente
const array1 = [{name:'Mike'},{name:'Alice'}]; console.log(array1.every(item => item.name !== 'Mike'));
, debería volver ciertosome
, actualizará mi respuesta.Tienes que hacer un bucle, no hay forma de evitarlo.
Por supuesto, podría usar una biblioteca como linq.js para hacer esto más agradable:
(ver jsFiddle para una demostración)
Dudo que linq.js sea más rápido que un ciclo directo, pero ciertamente es más flexible cuando las cosas se ponen un poco más complicadas.
fuente
Prueba de elementos de matriz:
JS ofrece funciones de matriz que le permiten lograr esto con relativa facilidad. Son los siguientes:
Array.prototype.filter
: Toma una función de devolución de llamada que es una prueba, la matriz se repite con la devolución de llamada y se filtra de acuerdo con esta devolución de llamada. Se devuelve una nueva matriz filtrada.Array.prototype.some
: Toma una función de devolución de llamada que es una prueba, la matriz se repite con su devolución de llamada y si algún elemento pasa la prueba, se devuelve el verdadero booleano. De lo contrario, se devuelve falsoLos detalles se explican mejor a través de un ejemplo:
Ejemplo:
Soporte de navegador:
Estas 2 funciones son
ES6
funciones, no todos los navegadores pueden admitirlas. Para superar esto, puede usar un polyfill. Aquí está el polyfill paraArray.prototype.some
(de MDN):fuente
si está utilizando jquery, puede aprovechar grep para crear una matriz con todos los objetos coincidentes:
y luego use la matriz de resultados:
fuente
Corrígeme si me equivoco ... podría haber usado un
forEach
método como este,Hoy en día estoy acostumbrado, por su simplicidad y su palabra que se explica por sí misma. Gracias.
fuente
Puedes probar esto, es trabajo para mí.
fuente
Puedes usar lodash . Si la biblioteca lodash es demasiado pesada para su aplicación, considere fragmentar la función innecesaria que no se utiliza.
Esta es solo una forma de hacer esto. Otro puede ser:
console.log(arr);
El ejemplo anterior también se puede reescribir sin usar ninguna biblioteca como:
Espero que mi respuesta ayude.
fuente
Muchas respuestas aquí son buenas y bastante fáciles. Pero si su conjunto de objetos tiene un conjunto fijo de valores, puede usar el siguiente truco:
Mapear todo el nombre en un objeto.
Ahora este dirtyObj puede usar una y otra vez sin ningún bucle.
fuente
Para comparar un objeto con otro, combino un bucle for in (usado para recorrer objetos) y some (). No tiene que preocuparse de que una matriz se salga de los límites, etc., de modo que ahorre algo de código. La documentación sobre .some se puede encontrar aquí
Una forma alternativa de comparar un objeto con otro es usar un bucle for anidado con Object.keys (). Length para obtener la cantidad de objetos en la matriz. Código a continuación:
Para responder a su pregunta exacta, si solo está buscando un valor en un objeto, puede usar un solo ciclo in.
fuente
Alternativamente, puedes hacer:
fuente
var without2 = (arr, args) => arr.filter(v => v.id !== args.id);
Ejemplo:without2([{id:1},{id:1},{id:2}],{id:2})
Resultado: sin2 ([{id: 1}, {id: 1}, {id: 2}], {id: 2})
fuente
fuente
Mi enfoque para resolver este problema es usar ES6 y crear una función que haga la comprobación por nosotros. El beneficio de esta función es que puede ser reutilizable a lo largo de su proyecto para verificar cualquier conjunto de objetos dado el
key
yvalue
para verificar.HABLAR SUFICIENTE, VAMOS EL CÓDIGO
Formación
Función
Llamada / Uso
fuente
Prefiero ir con regex.
Si su código es el siguiente,
yo recomendaria
fuente