¿Cómo puedo ingresar a una matriz si ninguno de los valores existe? Aquí está mi matriz:
[
{ name: "tom", text: "tasty" },
{ name: "tom", text: "tasty" },
{ name: "tom", text: "tasty" },
{ name: "tom", text: "tasty" },
{ name: "tom", text: "tasty" }
]
Si tratara de empujar de nuevo en la matriz, ya sea con name: "tom"
o text: "tasty"
, no quiero que le pase nada ... pero si ninguno de los que están allí entonces yo quiero que.push()
¿Cómo puedo hacer esto?
javascript
arrays
json
push
not-exists
Tarnfeld
fuente
fuente
Respuestas:
Puede ampliar el prototipo de matriz con un método personalizado:
fuente
Array.findIndex()
es una función JS incorporada que logrará lo mismo que su código.Para una matriz de cadenas (pero no una matriz de objetos), puede verificar si existe un elemento llamando
.indexOf()
y si no existe, simplemente inserte el elemento en la matriz:fuente
if (a.indexOf({ name: "tom", text: "tasty" })!=-1) a.push({ name: "tom", text: "tasty" })
dos veces. Agregará un objeto 'similar' dos veces.Es bastante fácil hacerlo usando la
Array.findIndex
función, que toma una función como argumento:fuente
http://api.jquery.com/jQuery.unique/
usted también podría estar interesado en makeArray
El ejemplo anterior es mejor al decir que verifique si existe antes de presionar. Veo en retrospectiva que también dice que puedes declararlo como parte del prototipo (supongo que también es Class Extension), por lo que no hay una gran mejora a continuación.
Excepto que no estoy seguro de si indexOf es una ruta más rápida que inArray. probablemente.
fuente
Note that this only works on arrays of DOM elements, not strings or numbers.
Además, indexOf no funciona en IE8 :(Utilice una biblioteca js como underscore.js por estos motivos exactamente. Uso: union: Calcula la unión de las matrices pasadas: la lista de elementos únicos, en orden, que están presentes en una o más de las matrices.
fuente
¿Me gusta esto?
Con objeto
fuente
array.find
es una mala idea porque busca en toda la matriz. UsofindIndex
, que solo busca hasta la primera aparición.Sé que esta es una pregunta muy antigua, pero si estás usando ES6 puedes usar una versión muy pequeña:
Muy fácil, al principio agregue un filtro que elimine el elemento, si ya existe, y luego agréguelo a través de un concat.
Aquí hay un ejemplo más realista:
Si su matriz contiene objetos, puede adaptar la función de filtro de esta manera:
fuente
Empuje dinámicamente
En un método simple
Si la matriz contiene solo tipos primitivos / matriz simple
fuente
Te sugiero que uses un Set ,
Los conjuntos solo permiten entradas únicas, lo que resuelve automáticamente su problema.
Los conjuntos se pueden declarar así:
fuente
Array.push
, por lo queSet.add
es el equivalente a eso.Código fácil, si 'indexOf' devuelve '-1' significa que el elemento no está dentro de la matriz, entonces la condición '=== -1' recupera verdadero / falso.
El operador '&&' significa 'y', por lo que si la primera condición es verdadera, la enviamos a la matriz.
fuente
No estoy seguro acerca de la velocidad, pero
stringification
+indexOf
es un enfoque simple. Comience por convertir su matriz en una cadena:Luego, para una serie de pares de atributos-valores, puede usar:
Encontrar un objeto completo es más simple:
fuente
En caso de que necesite algo simple sin querer extender el prototipo de matriz:
fuente
En caso de que alguien tenga requisitos menos complicados, aquí está mi adaptación de la respuesta para una matriz de cadenas simple:
Actualización: reemplazado indexOf y trim con alternativas jQuery para la compatibilidad de IE8
fuente
Utilicé map and reduce para hacer esto en el caso en que desea buscar por la propiedad específica de un objeto, útil ya que a menudo falla la igualdad directa de objetos.
fuente
Breve ejemplo:
fuente
a es la matriz de objetos que tienes
fuente
Puede usar el método findIndex con una función de devolución de llamada y su parámetro "this".
Nota: los navegadores antiguos no conocen findIndex pero hay un polyfill disponible.
Código de muestra (tenga en cuenta que en la pregunta original, un nuevo objeto se empuja solo si ninguno de sus datos está en objetos empujados previamente):
fuente
Supongo que es demasiado tarde para responder aquí, sin embargo, esto es lo que finalmente se me ocurrió para un administrador de correo que escribí. Trabajos es todo lo que necesito.
fuente
Esta es una función de trabajo para una comparación de objetos. En algunos casos, puede tener muchos campos para comparar. Simplemente repita la matriz y llame a esta función con elementos existentes y elementos nuevos.
fuente
Aquí tiene una manera de hacerlo en una línea para dos matrices:
fuente
Puede usar jQuery grep y push si no hay resultados: http://api.jquery.com/jQuery.grep/
Básicamente es la misma solución que en la solución "extender el prototipo", pero sin extender (o contaminar) el prototipo.
fuente
Puede verificar la matriz usando foreach y luego hacer estallar el elemento si existe; de lo contrario, agregue un nuevo elemento ...
muestra newItemValue & submitFields son pares clave, valor
fuente