J'utilise Object.entries afin d'extraire des valeurs d'un objet imbriqué et de le filtrer.

obj = Object.entries(obj)
  .filter(([k, v]) => {
    return true; // some irrelevant conditions here
  });

Mon objet se termine comme un tableau de tableaux, de clés et de valeurs.

[['key1', val]['key2', val']['key3', val]]

Existe-t-il un moyen simple de les mapper à nouveau dans un objet? La structure d'objet d'origine est:

{ key:val, key2:val2, key3:val3 }
17
userqwert 13 avril 2018 à 03:07

4 réponses

Meilleure réponse

Bien sûr, utilisez simplement .reduce pour attribuer à un nouvel objet:

const input = { key:'val', key2:'val2', key3:'val3' };

const output = Object.entries(input)
  .filter(([k, v]) => {
    return true; // some irrelevant conditions here
  })
  .reduce((accum, [k, v]) => {
    accum[k] = v;
    return accum;
  }, {});
console.log(output);

Dans les navigateurs modernes, vous pouvez également utiliser {{ X0}} ce qui rend cela encore plus facile - vous pouvez simplement passer un tableau d'entrées, et cela créera l'objet à partir de ces entrées.

const input = { key:'val', key2:'val2', key3:'val3' };

const output = Object.fromEntries(
  Object.entries(input)
    .filter(([k, v]) => {
      return true; // some irrelevant conditions here
    })
);
console.log(output);
25
Richie Bendall 25 sept. 2019 à 04:19

Si vous savez exactement quelles entrées vous souhaitez exclure, vous pouvez utiliser la déconstruction d'objet combinée à la diffusion:

function clean(obj) {
  const { unwanted1, unwanted2, ...wanted } = obj;
  return { ...wanted };
}

Dans certains cas, cela pourrait être la solution la plus propre.

0
Simon B. 19 sept. 2019 à 11:51

Utilisation de la réduction avec la déconstruction et opérateur virgule :

const input = { key:'val', key2:'val2', key3:'val3' };

const output = Object.entries(input)
  .filter(([k, v]) => {
     return true; // some irrelevant conditions here
  })
  .reduce((acc, [k, v]) => (acc[k] = v, acc), {});

Qui devrait donner les mêmes fonctionnalités que la réponse de CertainPerformance avec une syntaxe un peu plus concise

1
Simon B. 20 sept. 2019 à 20:39

Pour les nouveaux navigateurs, utilisez Object.fromEntries:

Object.fromEntries(arr); 

Pour ES6 +, avec une certaine diffusion, il peut s'agir d'un one liner .

arr.reduce((acc,[k,v])=>({...acc,[k]:v}),{}) 

Exemple:

Object.entries(sampleObject) // Turn object to array
   .reduce((acc,[k,v])=>({...acc,[k]:v}),{}) // Turn it back to object.
5
chickens 29 mars 2020 à 15:49