Как добавить новое значение в массив объекта по идентификатору (не новый элемент) - PullRequest
1 голос
/ 07 мая 2019

Я пытаюсь добавить новый value в мой массив по идентификатору.Я не пытаюсь добавить новый элемент в мой массив ... Для этого я могу использовать push(), но он добавляет новый элемент, а не новое значение.

Я пытаюсь сделать это:

Мой массив:

const data = 
[  
   {  
      "id": 1,
      "year":2019,
      "value": 2,
   },
   {  
      "id": 2,
      "year": 2019,
      "value": 89,
   },   
   {  
      "id": 3,
      "year": 2019,
      "value": 99,
   }   
]

Внутри определенного id Я хотел бы добавить новое значение, например:

data.forEach(item => {
  if(item.id === 2){
    //data inside id 2 -> item: 55
  }
})

Так что мой новый массив data выглядит следующим образом:

const data = 
[  
   {  
      "id": 1,
      "year":2019,
      "value": 2,
   },
   {  
      "id": 2,
      "year": 2019,
      "value": 89,
      "item": 55
   },   
   {  
      "id": 3,
      "year": 2019,
      "value": 99,
   }   
]

В большинстве моих поисков я обнаружил, как добавить новый элемент.Но это я умею делать (push()).

Так как же добавить новое значение внутрь указанного id?

Ответы [ 6 ]

2 голосов
/ 07 мая 2019

Просто назначьте свойство, которое вы хотите добавить:

data.forEach(item => {
  if(item.id === 2){
    item.item = 55;
  }
})

Если идентификаторы уникальны, вы можете использовать метод .find():

var el = data.find(item => item.id === 2);
if (el) {
  el.item = 55;
}
0 голосов
/ 07 мая 2019

У вас есть массив объектов, и вы хотите добавить поле к одному из объектов.Итак, сначала вы должны найти объект, который хотите изменить.Элементы массива могут быть доступны по индексу, но вы не знаете индекс.Есть несколько способов найти элемент в массиве.

var item = data.find(function(d, i){
    return item.id === 2; //criteria
});

или в синтаксисе ES6:

var item = data.find(d=>d.id == 2);

, после этого вы можете изменить элемент так, как вы хотите.

item.anotherField = 'another value';

Как вы сказали, push() добавляет элемент в массив.Он не изменяет существующие элементы в массиве.

0 голосов
/ 07 мая 2019

Ваш код более или менее прямо здесь.Чтобы установить свойство элемента, вы можете сделать object.propertyName = ... или object["propertyName"] = ....

. При этом вам просто нужно обновить пример, чтобы он выглядел так:

data.forEach(item => {
  if(item.id === 2){
    item.item = 55; //data inside id 2 -> item: 55
  }
})

В качестве более эффективной альтернативы рассмотрим Array.find().Он не продолжит цикл по массиву после того, как найдет id, тогда как ваш forEach будет всегда проходить по массиву полностью.

const data = [ { "id": 1, "year":2019, "value": 2, }, { "id": 2, "year": 2019, "value": 89, }, { "id": 3, "year": 2019, "value": 99, } ];

( data.find(({id})=> id === 2) || {} ).item = 55;
console.log(data);

Вы заметите, что я следовал за .find() с || {}.Это просто для того, чтобы, если элемент с id === 2 не был найден, попытка установить свойство не выдаст ошибку.

0 голосов
/ 07 мая 2019

Вы можете реализовать метод, используя Array.find, чтобы избежать ненужных итераций:

const array = [  
   {  
      "id": 1,
      "year":2019,
      "value": 2,
   },
   {  
      "id": 2,
      "year": 2019,
      "value": 89,
   },   
   {  
      "id": 3,
      "year": 2019,
      "value": 99,
   }   
];

const changeValue = (array, id, field, value) =>
  array.find(el => el.id === id)[field] = value;

changeValue(array, 1, 'year', 9999);
console.log('result: ', array);
0 голосов
/ 07 мая 2019

Вы можете повторять и присваивать значения на основе ваших критериев

data.map(function(x){
  if(x.id == 2){
    x.value = 100;
  }
})
0 голосов
/ 07 мая 2019

попробуй

data.find(x=> x.id==2).item=55;

const data = 
[  
   {  
      "id": 1,
      "year":2019,
      "value": 2,
   },
   {  
      "id": 2,
      "year": 2019,
      "value": 89,
   },   
   {  
      "id": 3,
      "year": 2019,
      "value": 99,
   }   
]

data.find(x=>x.id==2).item=55;

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