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" } ]
3 Réponses :
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);
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?
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);
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);
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]);
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 () a>, et si vous devez l'exécuter sur chaque élément, unforEach
devrait éviter le besoin defind ()
)