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 sertoTest.prop = true;
- Puede almacenar
a[i]
en una variable en lugar de buscarlo cada vez - Puede almacenar
a
cachéa
,b
yc
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
yc
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ó.