Aggiorna il valore dell'oggetto con valori in un array diverso

Aug 23 2020

Ho due array con la struttura seguente: Array1:

[{id:1234,name:"macaron",quantity:"330gm",rate:"100"},{id:5678,name:"Gelato",quantity:"450gm",rate:"200"}]

Array2:

[{id:1234,name:"macaron",quantity:"600gm",rate:"300"},{id:5678,name:"Gelato",quantity:"800gm",rate:"500"}]

risultato

Array1 =[{id:1234,name:"macaron",quantity:"330gm",rate:"300"},{id:5678,name:"Gelato",quantity:"450gm",rate:"500"}]

Voglio essere in grado di aggiornare le uniche tariffe degli oggetti in Array1 con la frequenza degli oggetti in Array2.

Risposte

charlietfl Aug 23 2020 at 15:22

Se l'ordine o le lunghezze degli array sono diversi, un modo efficiente è creare una mappa delle nuove tariffe da Array2, quindi eseguire il ciclo su Array1 e get()dalla mappa.

In questo modo si itera solo Array2una volta invece di utilizzare più iterazioni di metodi comefind()

let Array1=[{id:1234,name:"macaron",quantity:"330gm",rate:"100"},{id:5678,name:"Gelato",quantity:"450gm",rate:"200"}],
    Array2=[{id:1234,name:"macaron",quantity:"600gm",rate:"300"},{id:5678,name:"Gelato",quantity:"800gm",rate:"500"}];

const rateMap = new Map(Array2.map(({id, rate})=> [id, rate]));
Array1.forEach(e=> rateMap.has(e.id) && (e.rate = rateMap.get(e.id )))

console.log(Array1)

MajedBadawi Aug 23 2020 at 15:09

Puoi usare .mapper iterare su Array1elementi e .findper ottenere l'elemento con lo stesso idda Array2in ogni iterazione:

let Array1 = [
{id:1234,name:"macaron",quantity:"330gm",rate:"100"},{id:5678,name:"Gelato",quantity:"450gm",rate:"200"}
];
let Array2 = [
{id:1234,name:"macaron",quantity:"600gm",rate:"300"},{id:5678,name:"Gelato",quantity:"800gm",rate:"500"}
];
Array1 = Array1.map(item => {
  let e = Array2.find(e => e.id==item.id);
  if(e) item.rate = e.rate;
  return item;
});
console.log(Array1);

MA2WEB Aug 23 2020 at 15:16

let Array1 = [
    {id:1234,name:"macaron",quantity:"330gm",rate:"100"}, 
    {id:5678,name:"Gelato",quantity:"450gm",rate:"200"}
];

let Array2 = [
    {id:1234,name:"macaron",quantity:"600gm",rate:"300"}, 
    {id:5678,name:"Gelato",quantity:"800gm",rate:"500"}
];

for (i = 0; i < Array1.length ; i++) {
    Array1[i].rate = Array2[i].rate
}

console.log(Array1)

YohannesMolla Aug 23 2020 at 15:27
Array1 = Array1.map(item => { 
            return { ...item, rate: Array2.filter(rec => rec.id === item.id)[0].rate }; 
       }); 
});
Hiderr Aug 23 2020 at 15:17

La soluzione più pulita che ho trovato. Ma come ha detto charlietfl: presumo che entrambe le lunghezze siano uguali e nello stesso ordine

let array1 = [{id:1234,name:"macaron",quantity:"330gm",rate:"100"},{id:5678,name:"Gelato",quantity:"450gm",rate:"200"}]
let array2 = [{id:1234,name:"macaron",quantity:"600gm",rate:"300"},{id:5678,name:"Gelato",quantity:"800gm",rate:"500"}]

array1.updateRate = function(array2) {
    for(let i = 0; i < this.length;i++) {
        console.log(this[i].rate)
        this[i].rate = array2[i].rate;
        console.log(this[i].rate)
    }
}

array1.updateRate(array2);
console.log(array1)

Ecco la seconda soluzione (completa), in cui non si fa tale ipotesi:

let array1 = [{id:1234,name:"macaron",quantity:"330gm",rate:"100"},{id:5678,name:"Gelato",quantity:"450gm",rate:"200"}]
let array2 = [{id:1234,name:"macaron",quantity:"600gm",rate:"300"},{id:5678,name:"Gelato",quantity:"800gm",rate:"500"}]

array1.updateRate = function(array2) {
    for(let i = 0; i < this.length;i++) {
        for(let j = 0; j < array2.lenght;j++) {
            if(this[i].id === array2[j].id) {
                this[i].rate = array2[j].rate;
                break;
            }
        }
    }
}

array1.updateRate(array2);
console.log(array2)