J'aimerais savoir comment mettre à jour une matrice de liste d'objets à l'aide de JavaScript.
Comment mettre à jour le Sortie attendue: p> objlist code> avec le newobjlist code> en correspondant au ID code> et nom code>.
Si le ID code> et nom code> correspond à la mise à jour de l'objet objlist code> objet imbriqué. P>
4 Réponses :
Itérate à la fois par les tableaux et modifier si correspond à votre condition.
update strong>: voir comment les objets imbriqués (une profondeur de niveau dans votre échantillon) sont itérés. p> Observez comment les objets de tableau d'origine sont référencé directement. p> p>
Vous pouvez faire ce qui suit;
var newObjList = [{
"id": "service",
"name": "bank",
"amount": 2000
}, {
"id": "service",
"name": "credit",
"amount": 5000
}];
var objList = [{
"btob": [{
"id": "service",
"name": "bank",
"amount": 1000
}, {
"id": "fund",
"name": "bank",
"amount": 2000
}, {
"id": "others",
"name": "bank",
"amount": 5000
}]
}, {
"ctob": [{
"id": "service",
"name": "credit",
"amount": 1000,
"rate": 0.4
}, {
"id": "fund",
"name": "credit",
"amount": 3000,
"rate": 0.2
}, {
"id": "others",
"name": "credit",
"amount": 4000,
"rate": 0.6
}]
}];
var flatList = objList.flatMap(obj => obj["btob"] || obj["ctob"]);
newObjList.forEach(newObj => flatList
.filter(obj => obj.id == newObj.id && obj.name == newObj.name)
.forEach(obj => Object.keys(newObj).forEach(key => obj[key] = newObj[key])));
console.log(objList);
Merci d'aide, mais souhaitez renvoyer l'OBJ sans clés de codage ( obj.amount code>)
@Senthil Vérifiez à nouveau, j'ai mis à jour la logique afin que les valeurs de clé ne soient pas correctes. Mais il insérera de nouveaux champs à partir de newobj code>, par exemple, peut insérer un "taux": 0.4 code> à un obj dans objlist code> qui n'avait pas de tel Champ, est-ce que vous voulez un comportement correct?
Le code ci-dessous générerait l'objet requis de manière dynamique sans aucun exclusion de code papier sur les touches ou les valeurs. Si vous souhaitez renvoyer un objet totalement nouveau, vous pouvez probablement changer de retour dans la fonction code> ci-dessous sur p> {... a} code> et {... Childobj } code> selon ES6 pour obtenir une nouvelle copie des objets internes. function updateObj(list, newobj){
const result = [];
objList.forEach(obj => {
Object.entries(obj).map(k => {
const newRootObj = {};
newRootObj[k[0]] = k[1].map(childObj => {
const a = newObj.find(nObj => nObj.id === childObj.id && nObj.name === childObj.name);
if(a) {
childObj.amount = a.amount;
}
return childObj;
});
result.push(newRootObj);
});
});
return result;
}
const newObj=[{
"id": "service",
"name": "bank",
"amount": 2000
},{
"id": "service",
"name": "credit",
"amount": 5000
}];
const objList=[
{
"btob": [{
"id": "service",
"name": "bank",
"amount": 1000
},{
"id": "fund",
"name": "bank",
"amount": 2000
},{
"id": "others",
"name": "bank",
"amount": 5000
}]
},{
"ctob":[{
"id": "service",
"name": "credit",
"amount": 1000,
"rate": 0.4
},{
"id": "fund",
"name": "credit",
"amount": 3000,
"rate": 0.2
},{
"id": "others",
"name": "credit",
"amount": 4000,
"rate": 0.6
}]
}];
const result = updateObj(objList, newObj);
console.log(result);
Si vous vouliez une solution qui s'appuie sur tout le codage du tout - c'est-à-dire, aucun Considérez l'échantillon ci-dessous où j'ai ajouté une clé supplémentaire pour démontrer l'extensibilité. P> p> "BTOB" code> ou "CTOB" code>, vous pouvez utiliser un . mapper () code> pour boucle via objlist code>. Pour chaque élément dedans, en boucle via toutes ses paires de clés / valeur et de mettre à jour les correspondances en utilisant .Find () code>. Cela laisse également votre objet d'objet d'origine par opposition à la résilier. var newObj = [
{ "id": "service", "name": "bank", "amount": 2000 },
{ "id": "service", "name": "credit", "amount": 5000 },
{ "id": "test", "name": "test", "newKey": "Hello world!"}
];
var objList = [
{ "btob": [{ "id": "service", "name": "bank", "amount": 1000 },{ "id": "fund", "name": "bank", "amount": 2000 },{ "id": "others", "name": "bank", "amount": 5000 }] },
{ "ctob":[{ "id": "service", "name": "credit", "amount": 1000, "rate": 0.4 },{ "id": "fund", "name": "credit", "amount": 3000, "rate": 0.2 },{ "id": "others", "name": "credit", "amount": 4000, "rate": 0.6 }]},
{ "dtob": [{ "id": "test", "name": "test"}]}
];
let result = objList
.map(root => Object.keys(root)
.reduce((output,key) => (
{...output, [key]: root[key]
.flatMap(i => {
let replacement = newObj.find(f => i.id === f.id && i.name === f.name);
return replacement ? {...i, ...replacement} : i;
})
}
), {})
);
console.log(result);
Dupliqué possible de comparer des tableaux d'objets dans JavaScript