2
votes

Comment changer une clé d'objet sans muter le tableau d'origine

J'ai un tableau d'objets - je veux changer l'une des clés d'objet en quelque chose d'autre sans muter le tableau d'origine. quelle est la meilleure méthode pour aborder cela?

Je comprends que je pourrais utiliser la méthode Map mais je ne sais pas comment cela fonctionnerait. merci

const books = [
  { title: "To Kill a Mockingbird", writtenBy: "Harper Lee" }, 
  { title: "A Clockwork Orange",  author: "Anthony Burgess" },
  { title: "The Elephant Tree", writtenBy: "R.D. Ronald" } 
]

function changeKey(arr, keyChange, newKey) {

}

// i want to return so the KEY keyChange(author) is changed to newKey(writtenBy)
[
 { title: "To Kill a Mockingbird", writtenBy: "Harper Lee" },
 { title: "A Clockwork Orange",  writtenBy: "Anthony Burgess" },
 { title: "The Elephant Tree", writtenBy: "R.D. Ronald" } 
]


2 commentaires

Copie possible de JavaScript: Object Rename Key


Je ne suis pas sûr de comprendre la question: books étant un tableau const n'est pas pertinent à 100% dans cette question parce que vous voulez changer un champ dans l'un des objets contenus, alors ... changez-le simplement? let e = books.find (......); e.writtenBy = e.author; supprimer e.author; et terminé? (en utilisant Array.find () , et si vous devez l'exécuter sur chaque élément, un forEach devrait éviter le besoin de find () )


3 Réponses :


-2
votes

Ce qui suit ne modifie pas le tableau books .

const books = [
  { title: "To Kill a Mockingbird", writtenBy: "Harper Lee" },
  { title: "A Clockwork Orange", author: "Anthony Burgess" },
  { title: "The Elephant Tree", writtenBy: "R.D. Ronald" }
];

const renamedBooks = books.map(book => {
  if (book.author) {
    return {
      title: book.title,
      writtenBy: book.author
    };
  }

  return book;
});

console.info(renamedBooks);


5 commentaires

C'est un peu bizarre, car cela ne crée pas de copie des objets sans clé d'auteur. Ils ne sont pas modifiés dans changeKey, donc il répond correctement à la question, mais s'ils sont modifiés après qu'ils soient toujours le même objet. PAR EXEMPLE. supprimer les livres renommés [0] .title; console.log (livres [0]);


Nous n'avons pas nécessairement besoin de créer une copie ou le faisons-nous? Ce qui précède répond à la question Comment changer une clé d'objet sans muter le tableau d'origine


Oui, j'ai dit que cela répond correctement à la question. Cela ne répond tout simplement pas bien, à mon avis, pour la raison que j'ai indiquée. Si l'OP l'utilise, il peut en être satisfait en pensant qu'il a créé une copie de chaque objet, puis plus tard, ils peuvent modifier un objet dans renamedBooks sans s'attendre à ce qu'il affecte les objets dans livres < / code>, et provoque un bogue.


où est function changeKey (arr, keyChange, newKey) demandé par l'OP?


Où OP a-t-il demandé d'inclure nécessairement changeKey () ? IIUC, c'est ce que OP a demandé J'ai un tableau d'objets - je veux changer l'une des clés d'objet en autre chose sans muter le tableau d'origine. quelle est la meilleure méthode pour aborder cela?



0
votes

Vous pouvez mapper le tableau de paramètres et copier chacun des objets qu'il contient de manière superficielle en utilisant l'opérateur de diffusion. Pour chaque nouvel objet, s'il contient la clé que nous souhaitons supprimer, copiez la valeur dans la nouvelle clé et supprimez l'ancienne clé.

const books = [ {title: "To Kill a Mockingbird", writtenBy: "Harper Lee"}, {title: "A Clockwork Orange", author: "Anthony Burgess"}, {title: "The Elephant Tree", writtenBy: "R.D. Ronald"} ];

const changeKey = (arr, keyChange, newKey) =>
  arr.map(e => {
    const o = {...e};
    
    if (keyChange in o) {
      o[newKey] = o[keyChange];
      delete o[keyChange];
    }
    
    return o;
  })
;

console.log(changeKey(books, "author", "writtenBy"));
console.log(books);


0 commentaires

-1
votes

Les assistants de tableau tels que mapper, filtrer, réduire, etc. ne mutent pas le tableau d'origine, ils renvoient un nouveau tableau. Map reçoit une fonction en argument (callback). Mappez le tableau en appliquant votre rappel dans chaque élément.

const books = [ {title: "To Kill a Mockingbird", writtenBy: "Harper Lee"},
                {title: "A Clockwork Orange",  author: "Anthony Burgess"},
                {title: "The Elephant Tree", writtenBy: "R.D. Ronald"} ];

//Function to use as a callback on map
function changeKey(current) {
  if(current.author) return { title: current.title, writtenBy: current.author };
  return current;
}

//Creating new array applying changeKey in every element thanks to map
const newBooks = books.map(changeKey);
console.log(newBooks);


1 commentaires

C'est un peu bizarre, car cela ne crée pas de copie des objets sans clé d'auteur. Ils ne sont pas modifiés dans changeKey, donc il répond correctement à la question, mais s'ils sont modifiés après qu'ils soient toujours le même objet. PAR EXEMPLE. supprimer newBooks [0] .title; console.log (livres [0]);