Tengo esta matriz de objetos.
let arr = [ { id: 1, }, { id: 1, }, { id: 2, }, { id: 1, }, { id:4, }, { id: 3, }, { id:4, } ] necesito encontrar y cambiar cada objeto en la matriz según la condición. Entonces, si hay duplicados en la matriz, necesito configurar mis objetos 100 , excepto el último duplicado donde debería tener 200 . Si no tengo ningún duplicado, debería tenerlo de nuevo 200
Entonces la salida debería ser
let arr = [ { id: 1, number: 100 }, { id: 1, number: 100 }, { id: 2, number: 200 }, { id: 1, number: 200 }, { id:4, number: 100 }, { id: 3, number: 200 }, { id:4, number: 200 } ] entonces id 1 has duplicates . Es por eso que las primeras ocurrencias se configuran con number:100 y la última que configuro con number:200 .
Id 2 tiene el número 200 porque no hay duplicados y es la primera aparición en la lista.
lo que probé
me quedé atascado en
for(let item of arr) { for(let item2 of arr) { if(item.id === item2.id) { item.number = 100; } else { item.number = 200; } } }Simplemente puede iterar a través de la matriz en sentido inverso y realizar un seguimiento de las id que ha visto, aquí usando un Set .
const arr = [{ id: 1, }, { id: 1, }, { id: 2, }, { id: 1, }, { id: 4, }, { id: 3, }, { id: 4, }] let i = arr.length; const seen = new Set(); while (i--) { arr[i].number = seen.has(arr[i].id) ? 100 : 200; seen.add(arr[i].id) } console.log(arr)Puede usar array.map() para iterar sobre su matriz. Creo que puede proporcionar una solución agradable y concisa:
const result = arr.map((item, index) => { const duplicate = arr.filter((_, indx) => indx > index).some((i) => i.id === item.id); return { ...item, number: duplicate ? 100 : 200 } }); console.log(result);Simplemente podemos lograrlo a través de Array.map() junto con los métodos Array.indexOf() y Array.lastIndexOf() .
Demostración de trabajo:
// Input array let arr = [{ id: 1, }, { id: 1, }, { id: 2, }, { id: 1, }, { id:4, }, { id: 3, }, { id:4, }]; // Getting ID's from each object and create a seperate array let idArr = arr.map(function(item) { return item.id }); // Iterating through the id's array and assigning number property to an original array as per the requirement. idArr.forEach((item, index) => { if (idArr.indexOf(item) === idArr.lastIndexOf(item)) { arr[index].number = 200; } else { arr[index].number = 100; arr[idArr.lastIndexOf(item)].number = 200; } }); // Result console.log(arr);