Как изменить ключ объекта без изменения исходного массива - PullRequest
1 голос
/ 12 июня 2019

У меня есть массив объектов - я хочу изменить один из ключей объекта на что-то другое, не изменяя исходный массив.Каков наилучший метод для этого?

Я понимаю, что мог бы использовать метод Map, но не уверен, как это будет работать.спасибо

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 ]

0 голосов
/ 12 июня 2019

Вы можете map массив параметров и поверхностно копировать каждый из объектов в нем, используя оператор распространения.Для каждого нового объекта, если он содержит ключ, который мы хотели бы удалить, скопируйте значение в новый ключ и delete старый ключ.

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 голосов
/ 12 июня 2019

Помощники по массиву, такие как map, filter, Reduce и т. Д., Не изменяют исходный массив, они возвращают новый массив.Карта получает функцию в качестве аргумента (обратный вызов).Карта итерирует массив, применяя ваш обратный вызов в каждом элементе.

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);
0 голосов
/ 12 июня 2019

Следующее не будет мутировать 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);
...