Есть ли более короткий / более эффективный способ использовать оператор распространения в JavaScript для обновления значения ключа? - PullRequest
0 голосов
/ 28 декабря 2018

Недавно я заинтересовался использованием синтаксиса оператора распространения, поэтому я попробовал несколько примеров, у меня есть этот пример массива:

var entities = [
  {
    "id": 1,    
    "age": 33,
    "hobby": "games"
  },
  {
    "id": 2,
    "age": 28,
    "hobby": "chess"
  },
  {
    "id": 3,
    "age": 21,
    "hobby": "comics"
  },
  {
    "age": 23,
    "hobby": "games"
  }
]

Затем, чтобы обновить все увлечения «один раз», я делаю следующее:

entities.forEach(function(entity, index) {
  this[index] = {...entity, hobby: "Some String to update all hobbies"};
}, entities);
console.log(entities)

Что работает, но мне было интересно, есть ли более эффективный или более короткий способ достичь этого при использовании оператора распространения.Любые предложения?
РЕДАКТИРОВАТЬ:
forEach мне не нужно, или даже сделать это таким образом, мне было интересно, можно ли использовать синтаксис распространения (или нет) для обновления вложенных значений

Ответы [ 3 ]

0 голосов
/ 28 декабря 2018

Оператор распространения будет перебирать все ключи в объекте, чтобы скопировать их и их значения в новый объект.Если вы хотите большей эффективности, не используйте оператор распространения.Просто назначьте непосредственно каждому объекту при выполнении итерации по списку:

entity.hobby = "Some String to update all hobbies"

Обратите внимание, что это изменяет объект в существующем массиве.Так что вам не нужно присваивать this[index].В качестве альтернативы вы можете использовать map() вместо foreach() для возврата нового массива, созданного из существующего массива.

0 голосов
/ 28 декабря 2018

Не уверен, действительно ли нужен оператор спреда для того, что вы делаете?

Вы также можете заглянуть в эту ссылку для интересного использования спреда, Array.from и оператора rest.

Подробнее о простом операторе спреда здесь .

Если вы ищете более изощренный или меньший способ написать это, вот два, один из которых использует .map и spread для возврата копии сущностей, а другой использует .forEach и обновляетте же объекты массива:

 const COMMON_HOBBY = 'Coding';
 let entities = [{
        "id": 1,    
        "age": 33,
        "hobby": "games"
      },
      {
        "id": 2,
        "age": 28,
        "hobby": "chess"
      }];


    // To assign to new array (copy)
    let output = entities.map((entity) => ({...entity, hobby: COMMON_HOBBY }));
    console.log(output);

    // Mutate /edit same array entities 
    entities.forEach((entity) => entity.hobby = COMMON_HOBBY );
    console.log(entities);
0 голосов
/ 28 декабря 2018

Оператор спреда не очень помогает при обновлении списка, как вы делаете в своем примере.Проще обновить свойство каждого объекта:

var entities = [ { "id": 1, "age": 33, "hobby": "games" }, { "id": 2, "age": 28, "hobby": "chess" }, { "id": 3, "age": 21, "hobby": "comics" }, { "age": 23, "hobby": "games" } ]

entities.forEach(entity => {
  entity.hobby = "Some String to update all hobbies";
});

console.log(entities)

Оператор распространения полезен, если вы хотите создавать копии объектов, как вы, возможно, захотите сделать в .map:

var entities = [ { "id": 1, "age": 33, "hobby": "games" }, { "id": 2, "age": 28, "hobby": "chess" }, { "id": 3, "age": 21, "hobby": "comics" }, { "age": 23, "hobby": "games" } ]

const newEntities = entities.map(entity =>
  ({...entity, hobby: "Some String to update all hobbies"})
);

console.log(newEntities)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...