J'ai un tableau d'objets comme celui-ci:
channels=[
{name: mega, status: false},
{name: ant, status: true},
{name: apl, status: true}
]
et j'ai un seul objet avec ce format
obj = {0: false, 1: true}
Les clés dans l'objet plain représente les index du tableau channels . Les propriétés status doivent être mises à jour.
Pour les exemples de données ci-dessus, les canaux doivent être mis à jour pour:
channels=[
{name: mega, status: true},
{name: ant, status: false},
{name: apl, status: true}
]
Comment puis-je mettre en œuvre cela efficacement? p >
4 Réponses :
Une simple boucle for fera l'affaire:
const channels=[{name: "mega", status: true}, {name: "ant", status: false}, {name: "apl", status: true}];
const obj={0: false, 1:true};
const result = channels.map(({name, status}, i) =>
({name, status: i in obj ? obj[i] : status})
);
console.log(result);
const channels=[{name: "mega", status: true}, {name: "ant", status: false}, {name: "apl", status: true}];
const obj={0: false, 1:true};
for (let index in obj) {
channels[index].status = obj[index];
}
console.log(channels);
Si vous ne voulez pas muter le tableau d'origine, mais voulez un nouveau tableau avec les modifications, alors:
for (let index in obj) channels[index].status = obj[index];
Cette boucle devrait le faire.
for(var key in obj){
channels[key].status = obj[key]
}
Vous pouvez parcourir le tableau canaux en utilisant forEach () et utiliser Object.assign () pour remplacer la propriété.
p>
.as-console-wrapper { max-height: 100% !important; top: 0; }
let channels = [
{name: 'mega', status: true },
{name: 'ant' , status: false},
{name: 'apl' , status: true }
];
let obj = {
0: false,
1: true
};
channels.forEach((o, i) => i in obj ? Object.assign(o, {status: obj[i]}) : o);
console.log(channels);
Cela conduit à "statut": non défini
Merci @Bergi. J'ai ajouté un correctif.
Vous pouvez parcourir le Dans le cas fourni, le tableau d'origine est muté, et si ce n'est pas ce dont vous avez besoin, je vous recommande de jeter un œil sur obj avec la méthode de votre choix (ici, j'ai utilisé Object.keys pour obtenir un tableau de clés depuis obj code > objet et forEach pour les parcourir) et mettre à jour le champ. Cela peut être réalisé en une seule ligne de code: const channels = [
{name: "mega", status: true},
{name: "ant", status: false},
{name: "apl", status: true}
];
const obj = {
"0": false,
"1": true
};
Object.keys(obj).forEach((item, i) => channels[i].status = obj[i]);
/**
* If "channels" array is NOT ALWAYS longer than the amount of "obj" properties,
* you should add the check for existence, the simpliest one is implemented below:
*
* Object.keys(obj).forEach((item, i) => channels[i] ? channels[i].status = obj[i] : null);
*/
console.log(channels);
map , elle ne modifie pas la méthode tableau d'origine, il en crée un nouveau à la place.
Malheureusement, cela ne fonctionne pas finalement. Parce que le type d'index dans le tableau est un nombre et le type de clé dans mon objet est une chaîne :( Il renvoie undefined
@Alex_R, êtes-vous sûr que c'est le cas? Parce que j'ai mis à jour la réponse (les clés encapsulées de obj sous forme de chaînes) et que cela fonctionne toujours, car cela n'a pas vraiment d'importance dans ce cas. Quoi qu'il en soit, si le problème concerne uniquement les types, vous pouvez simplement faire .toString () et comparer davantage les chaînes.
OP a demandé une implémentation efficace . Si channels est grand et que les mises à jour obj sont petites, la boucle forEach ne fera aucun bien.
@Bergi, tu as raison, ma faute. J'ai mis à jour la réponse.
Pourriez-vous publier ce que vous avez essayé jusqu'à présent?
Si
megaest censé être une chaîne littérale, alors les guillemets sont manquants (également sur les autres entrées)Merci! C'est une corde