1
votes

Comment utiliser l'opérateur d'étalement de déstructuration d'objet pour supprimer plusieurs propriétés d'objet

J'utilise dans mes réducteurs Map / Tableau associatif pour stocker l'objet via un identifiant de chaîne.

Quand j'ai besoin d'un nouvel élément dans la carte, j'utilise cette construction

const contentIds = ['id1','id2','id3']

// something like ???
const {...[ids], ...rows} 

Lorsque j'ai besoin de supprimer une carte de formulaire d'élément par identifiant, j'utilise ceci.

const  { [rowId]: deleted, ...rows } = state.rows;

Dans les lignes variables, j'ai une carte et une propriété avec le nom rowId est manquante.

Je me demande comment puis-je faire cela si j'ai plusieurs identifiants dans le tableau et que j'ai besoin de tous les supprimer via l'opérateur ... et la déstructuration.

rows: { ...state.rows, [row.id]: row }

Oui, je peux écrire lamda pour cela ou utiliser omit lodash. Mais juste intéressant si c'est possible.

Merci beaucoup


0 commentaires

3 Réponses :


3
votes

Vous pouvez réduire les clés avec l'objet.

var object = { id: 1, id1: 2, id2: 3 },
    contentIds = ['id1', 'id2', 'id3'],
    result = contentIds.reduce((o, k) => ({ [k]: _, ...r } = o, r), object);

console.log(result);


2 commentaires

Salut ... comme votre solution ... je sais comment le faire ... Je me demandais simplement s'il est possible de le faire via une simple propagation et une déstructuration aussi élégante que la suppression d'un identifiant


la réponse est que vous ne pouvez pas diffuser les clés pour obtenir un devoir. réellement.



0
votes
function filterObjectByKeys (object, keysToFilter) {
  return Object.keys(object).reduce((accum, key) => {
    if (!keysToFilter.includes(key)) {
      return { ...accum, [key]: object[key] }
    } else {
      return accum
    }
  }, {})
}

0 commentaires

0
votes

Je me demande comment puis-je faire cela si j'ai plusieurs identifiants dans le tableau et que je besoin de tous les supprimer via l'opérateur ... et la déstructuration.

Non, vous ne pouvez pas faire cela, vous êtes probablement confondu avec la syntaxe reste et spread , ... sur la gauche Le côté de l'affectation est la syntaxe reste et non spread

Repos et diffusion

Et la syntaxe reste attend ... suivi du nom de la variable, ce que vous essayez est syntaxError

const object = { id: 1, id1: 2, id2: 3 };
const contentIds = ['id1', 'id2', 'id3'];
const objCopy = object

contentIds.forEach(key=>{
  delete objCopy[key]
})

console.log(objCopy);

De plus, vous ne pouvez pas utiliser , la virgule après reste donc même si vous le faites

const object = {a:1,b:2,c:3}

const {...a, ...rows} = object

console.log(rows)

il est toujours invalide

let {...a, ...rows } = obj 

Vous pouvez utiliser la solution suggérée par @nina ou vous pouvez créer une copie de l'objet et parcourir contentIds et supprimer la clé / valeur de copyObj pour obtenir la valeur souhaitée

const object = {a:1,b:2,c:3}
const a = ['a','b']
const {...[a], ...rows} = object

console.log(rows)

0 commentaires