repetidos recorrer objetos objects index elementos elemento buscar array agregar javascript duplicates

recorrer - Encuentre duplicados de algunas claves en una matriz de objetos de JavaScript y establezca una clave relacionada para true



javascript indexof array of objects (4)

Lo que tienes es más o menos eso. Hay ajustes que puede realizar, pero está bien, excepto que desea detener un paso antes, cuando i < a.length - 1 (ya que no desea comparar la última entrada consigo mismo y configurar prop incorrectamente).

Algunos ajustes que podrías hacer:

  • a[a.length-1].prop = true; podría ser toTest.prop = true;
  • Puede almacenar a[i] en una variable en lugar de buscarlo cada vez
  • Puede almacenar a caché a , b y c lugar de buscarlos en el objeto cada vez (pero el motor de JavaScript lo hará si importa de todos modos)
  • En ES2015 + puede usar la asignación de desestructuración para obtener a , b y c

Entonces, por ejemplo:

// Caching the last item var last = a[a.length - 1]; // Caching the values to check var checka = last.a, checkb = last.b, checkc = last.c; // Stop at i < a.length - 1, caching that to l for (var i = 0, l = a.length - 1; i < l; ++i) { // Cache a[i] var entry = a[i]; if (entry.a == checka && entry.b == checkb && entry.c == checkc) { entry.prop = last.prop = true; } }

Copia en vivo:

var a = [{a:"a1",b:"b",c:"c",prop:false}, {a:"a1",b:"b",c:"c",prop:false}, {a:"a",b:"b",c:"c",prop:false}, {a:"a2",b:"b",c:"c",prop:false}, {a:"a3",b:"b",c:"c",prop:false}, {a:"a1",b:"b",c:"c",prop:false}]; // Caching the last item var last = a[a.length - 1]; // Caching the values to check var checka = last.a, checkb = last.b, checkc = last.c; // Stop at i < a.length - 1, caching that to l for (var i = 0, l = a.length - 1; i < l; ++i) { // Cache a[i] var entry = a[i]; if (entry.a == checka && entry.b == checkb && entry.c == checkc) { entry.prop = last.prop = true; } } console.log(a);

.as-console-wrapper { max-height: 100% !important; }

Aquí hay una versión ES2015 +, solo para referencia:

const last = a[a.length - 1]; const {a: checka, b: checkb, c: checkc} = last; for (let i = 0, l = a.length - 1; i < l; ++i) { const {a: thisa, b: thisb, c: thisc} = a[i]; if (thisa == checka && thisb == checkb && thisc == checkc) { a[i].prop = last.prop = true; } }

Copia en vivo:

const a = [{a:"a1",b:"b",c:"c",prop:false}, {a:"a1",b:"b",c:"c",prop:false}, {a:"a",b:"b",c:"c",prop:false}, {a:"a2",b:"b",c:"c",prop:false}, {a:"a3",b:"b",c:"c",prop:false}, {a:"a1",b:"b",c:"c",prop:false}]; const last = a[a.length - 1]; const {a: checka, b: checkb, c: checkc} = last; for (let i = 0, l = a.length - 1; i < l; ++i) { const {a: thisa, b: thisb, c: thisc} = a[i]; if (thisa == checka && thisb == checkb && thisc == checkc) { a[i].prop = last.prop = true; } } console.log(a);

.as-console-wrapper { max-height: 100% !important; }

Si usted cumple con alguno de sus criterios depende de usted.

Tengo una matriz de objetos JS:

var a = [{a:"a1",b:"b",c:"c",prop:false}, {a:"a1",b:"b",c:"c",prop:false}, {a:"a",b:"b",c:"c",prop:false}, {a:"a2",b:"b",c:"c",prop:false}, {a:"a3",b:"b",c:"c",prop:false}, {a:"a1",b:"b",c:"c",prop:false}];

Debo encontrar duplicados del último elemento pero SIN considerar el prop clave: cuando los encuentre, el booleano de prop relacionado debe establecerse en true .

Hice lo más simple del mundo y funciona bien, pero estaba vagando si hay algo que JS puede hacer (sin bibliotecas de terceros), mejor en "elegancia", modernidad o rendimiento:

var toTest = a[a.length-1]; for(var i=0;i<a.length;i++){ if(toTest.a==a[i].a && toTest.b==a[i].b && toTest.c==a[i].c){ a[i].prop = true; a[a.length-1].prop = true; } }

Cualquier propina es apreciada


Puede usar la normal para forEach bucle

var a = [{a:"a1",b:"b",c:"c",prop:false}, {a:"a1",b:"b",c:"c",prop:false}, {a:"a",b:"b",c:"c",prop:false}, {a:"a2",b:"b",c:"c",prop:false},{a:"a1",b:"b",c:"c",prop:false},{a:"a1",b:"b",c:"c",prop:false}]; var toTest = a[a.length-1]; a.forEach(function(item){ item.prop = (item.a == toTest.a && item.b == toTest.b && item.c == toTest.c) ? true : false; }); console.log(a);


Puede usar una combinación de Array.forEach y Array.every . Cree una lista de claves para probar y en cada iteración, verifique estas claves y actualice el objeto.

a[a.length-1].prop = true parece innecesario ya que no está eliminando el elemento, por lo que se actualizará en la última iteración.

var a = [{a:"a1",b:"b",c:"c",prop:false}, {a:"a1",b:"b",c:"c",prop:false}, {a:"a",b:"b",c:"c",prop:false}, {a:"a2",b:"b",c:"c",prop:false}, {a:"a3",b:"b",c:"c",prop:false}, {a:"a1",b:"b",c:"c",prop:false}]; var toTest = a[a.length -1]; var keysToTest = [''a'', ''b'', ''c'']; a.forEach((o)=>{ var valid = keysToTest.every((k) => o[k] === toTest[k]); if(valid){ o.prop = true; } }); console.log(a)


Use Array.filter() con una función que solo compara a , b y c .

Editar: Reemplacé completamente mi respuesta anterior. Creo que Array.filter () es el camino a seguir para buscar duplicados de la última entrada en la matriz como se solicitó.