2
votes

Construire un tableau d'objets en utilisant un autre tableau d'objets et un seul objet

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 >


3 commentaires

Pourriez-vous publier ce que vous avez essayé jusqu'à présent?


Si mega est censé être une chaîne littérale, alors les guillemets sont manquants (également sur les autres entrées)


Merci! C'est une corde


4 Réponses :


1
votes

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];


0 commentaires

0
votes

Cette boucle devrait le faire.

 for(var key in obj){
       channels[key].status = obj[key]
    }


0 commentaires

-1
votes

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);


2 commentaires

Cela conduit à "statut": non défini


Merci @Bergi. J'ai ajouté un correctif.



0
votes

Vous pouvez parcourir le 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);

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 map , elle ne modifie pas la méthode tableau d'origine, il en crée un nouveau à la place.


4 commentaires

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.