objetos objeto multidimensional into elementos array agregar javascript arrays json push not-exists

javascript - objeto - Array.push() si no existe?



javascript array multidimensional push (15)

¿Me gusta esto?

var item = "Hello World"; var array = []; if (array.indexOf(item) === -1) array.push(item);

Con objeto

var item = {name: "tom", text: "tasty"} var array = [{}] if (!array.find(o => o.name === ''tom'' && o.text === ''tasty'')) array.push(item)

¿Cómo puedo presionar en 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 traté de volver a presionar en la matriz con el name: "tom" o text: "tasty" , no quiero que pase nada ... pero si ninguno de los dos está ahí, entonces quiero que sea .push()

¿Cómo puedo hacer esto?


En caso de que alguien tenga requisitos menos complicados, aquí está mi adaptación de la respuesta para una matriz de cadenas simple:

Array.prototype.pushIfNotExist = function(val) { if (typeof(val) == ''undefined'' || val == '''') { return; } val = $.trim(val); if ($.inArray(val, this) == -1) { this.push(val); } };

Actualización: reemplazo de indexOf y recorte con alternativas jQuery para compatibilidad con IE8


En caso de que necesite algo simple sin querer extender el prototipo Array:

// Example array var array = [{id: 1}, {id: 2}, {id: 3}]; function pushIfNew(obj) { for (var i = 0; i < array.length; i++) { if (array[i].id === obj.id) { // modify whatever property you need return; } } array.push(obj); }


Es bastante fácil de hacer usando la función Array.findIndex , que toma una función como argumento:

var a = [{name:"bull", text: "sour"}, { name: "tom", text: "tasty" }, { name: "tom", text: "tasty" } ] var index = a.findIndex(x => x.name=="bob") // here you can check specific property for an object whether it exist in your array or not if (index === -1){ a.push({your_object}); } else console.log("object already exists")


Esto funciona en func para una comparación de objetos. En algunos casos, es posible que tenga muchos campos para comparar. Simplemente recorra la matriz y llame a esta función con un elemento existente y un nuevo elemento.

var objectsEqual = function (object1, object2) { if(!object1 || !object2) return false; var result = true; var arrayObj1 = _.keys(object1); var currentKey = ""; for (var i = 0; i < arrayObj1.length; i++) { currentKey = arrayObj1[i]; if (object1[currentKey] !== null && object2[currentKey] !== null) if (!_.has(object2, currentKey) || !_.isEqual(object1[currentKey].toUpperCase(), object2[currentKey].toUpperCase())) return false; } return result; };


No estoy seguro acerca de la velocidad, pero stringification + indexOf es un enfoque simple. Comienza convirtiendo tu matriz en una cadena:

let strMyArray = JSON.stringify(myArray);

Luego, para una serie de pares de valores-atributos, puede usar:

if (strMyArray.indexOf(''"name":"tom"'') === -1 && strMyArray.indexOf(''"text":"tasty"'')) { myArray.push({ name: "tom", text: "tasty" }); }

Encontrar un objeto completo es más simple:

if (strMyArray.indexOf(JSON.stringify(objAddMe) === -1) { myArray.push(objAddMe); }


Para una serie de cadenas (pero no una matriz de objetos), puede verificar si existe un elemento llamando a .indexOf() y si no lo hace, simplemente inserte el elemento en la matriz:

var newItem = "NEW_ITEM_TO_ARRAY"; var array = ["OLD_ITEM_1", "OLD_ITEM_2"]; array.indexOf(newItem) === -1 ? array.push(newItem) : console.log("This item already exists"); console.log(array)


Puede ampliar el prototipo de matriz con un método personalizado:

// check if an element exists in array using a comparer function // comparer : function(currentElement) Array.prototype.inArray = function(comparer) { for(var i=0; i < this.length; i++) { if(comparer(this[i])) return true; } return false; }; // adds an element to the array if it does not already exist using a comparer // function Array.prototype.pushIfNotExist = function(element, comparer) { if (!this.inArray(comparer)) { this.push(element); } }; var array = [{ name: "tom", text: "tasty" }]; var element = { name: "tom", text: "tasty" }; array.pushIfNotExist(element, function(e) { return e.name === element.name && e.text === element.text; });


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 cuidado de que en la pregunta original, un objeto nuevo se inserte solo si ninguno de sus datos está en objetos previamente empujados):

var a=[{name:"tom", text:"tasty"}], b; var magic=function(e) { return ((e.name == this.name) || (e.text == this.text)); }; b={name:"tom", text:"tasty"}; if (a.findIndex(magic,b) == -1) a.push(b); // nothing done b={name:"tom", text:"ugly"}; if (a.findIndex(magic,b) == -1) a.push(b); // nothing done b={name:"bob", text:"tasty"}; if (a.findIndex(magic,b) == -1) a.push(b); // nothing done b={name:"bob", text:"ugly"}; if (a.findIndex(magic,b) == -1) a.push(b); // b is pushed into a


Puede usar jQuery grep y presionar 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 (ni contaminar) el prototipo.


Puede verificar la matriz usando foreach y luego mostrar el elemento si existe, de lo contrario, agregar un nuevo elemento ...

ejemplo newItemValue & submitFields son clave, pares de valores

> //submitFields existing array > angular.forEach(submitFields, function(item) { > index++; //newItemValue new key,value to check > if (newItemValue == item.value) { > submitFields.splice(index-1,1); > > } }); submitFields.push({"field":field,"value":value});


Sé que esta es una pregunta muy antigua, pero si usas ES6 puedes usar una versión muy pequeña:

[1,2,3].filter(f => f !== 3).concat([3])

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:

const myArray = [''hello'', ''world''] const newArrayItem myArray.filter(f => f !== newArrayItem).concat([newArrayItem])

Si su matriz contiene objetos, puede adaptar la función de filtro de esta manera:

someArray.filter(f => f.some(s => s.id === myId)).concat([{ id: myId }])


Utilicé el mapa y lo reduje para hacer esto en el caso en que desee buscar por una propiedad específica de un objeto, útil como la igualdad directa de objetos a menudo fallará.

var newItem = {''unique_id'': 123}; var searchList = [{''unique_id'' : 123}, {''unique_id'' : 456}]; hasDuplicate = searchList .map(function(e){return e.unique_id== newItem.unique_id}) .reduce(function(pre, cur) {return pre || cur}); if (hasDuplicate) { searchList.push(newItem); } else { console.log("Duplicate Item"); }


Utilice una biblioteca js como underscore.js por estas razones exactamente. Uso: union: calcula la unión de los arreglos pasados: la lista de elementos únicos, en orden, que están presentes en una o más de las matrices.

_.union([1, 2, 3], [101, 2, 1, 10], [2, 1]); => [1, 2, 3, 101, 10]


http://api.jquery.com/jQuery.unique/

var cleanArray = $.unique(clutteredArray);

usted también podría estar interesado en makeArray

El ejemplo anterior es el mejor al decir que compruebe si existe antes de presionar. Veo en retrospectiva que también declara que puedes declararlo como parte del prototipo (supongo que es también la extensión de clase), 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.

Array.prototype.pushUnique = function (item){ if(this.indexOf(item) == -1) { //if(jQuery.inArray(item, this) == -1) { this.push(item); return true; } return false; }