Как изменить значение, помещенное внутри массива в объекте json в массиве json?

#javascript #arrays #json #iteration

#javascript #массивы #json #итерация

Вопрос:

Я использую javascript для выполнения этого.

Я хочу изменить [0,0,1] на [3,0,1] где id = 'a' .

 [
 {'id' : 'a', arr : [0,0,1]},
 {'id' : 'b', arr : [1,0,1]},
 {'id' : 'c', arr : [1,4,1]}
]
  

Спасибо.

Комментарии:

1. Используйте Array.prototype.find() , чтобы получить соответствующий объект и изменить arr свойство, или (если требуется неизменность) используйте Array.prototype.findIndex() , чтобы найти индекс соответствующего элемента, затем перестройте исходный массив (из его мелкой копии) с измененным целевым элементом, или используйте Array.prototype.map() со всеми неизмененными элементами, кроме того, который соответствует id .

2. mArr=[ {'id' : 'a', arr : [0,0,1]}, {'id' : 'b', arr : [1,0,1]}, {'id' : 'c', arr : [1,4,1]} ]; mArr.forEach(item=>{if(item.id=="a") item.arr=[3,0,1]; return item;});

3. @iAmOren : если выбирать между изменяющимися подходами, я бы предпочел .find() — он завершит цикл, как только совпадение будет найдено, позволяя вам изменять его вывод, в то время как .forEach() будет повторяться без необходимости до конца исходного массива, который может оказаться относительно большим.

Ответ №1:

     You can have few different approach to achieve this
    1. using Map
        
  let tmp = [
    {'id' : 'a', arr : [0,0,1]},
    {'id' : 'b', arr : [1,0,1]},
    {'id' : 'c', arr : [1,4,1]}
   ]
   var updated_array;
   updated_array = tmp.map(function(element){
       if(element.id == 'a'){
         return {
          id: element.id,
          arr : [3,0,1]

          }   
       } else {
         return element
        }
   })
    
    2. Using Filter

   updated_array = tmp.filter(function(element){
    if(element.id == 'a'){
      return {
       id: element.id,
       arr : [3,0,1]

       }   
    } else {
      return element
     }
})

    3. Using ForEach


tmp.forEach(function(element){
          if(element.id == 'a'){
            element.arr = [3,0,1]
          }
        }) 


    4. You can also use traditional while or for loop to achieve this
  

Ответ №2:

Вы можете использовать map() массива и обновить значение. Проверьте приведенный ниже код.

 let tmp = [
 {'id' : 'a', arr : [0,0,1]},
 {'id' : 'b', arr : [1,0,1]},
 {'id' : 'c', arr : [1,4,1]}
]

tmp.map(item =>{
 if (item.id === 'a'){
  item.arr=[3,0,1];
 }
})

console.log(tmp);  

Комментарии:

1. Использование .map() для изменения исходного массива немного сбивает с толку, вам было бы намного лучше с Array.prototype.forEach()

2. Это тоже сбило меня с толку. «Как он использует .map, ничего не возвращая?»

3. Еще одна вещь, которую вы должны учитывать, что ваш подход, вероятно, является одним из наименее эффективных среди неизменяемых — он будет проходить через весь массив, чтобы изменить один элемент (который может появиться, как в этом случае, прямо в первой позиции). При достаточно больших входных данных это может привести к потере производительности. В качестве альтернативного способа Array.prototype.find() может быть использован, который завершит цикл при достижении соответствия, поэтому вы можете использовать его вывод для изменения arr свойства.

4. …и это был не мой downvote, на всякий случай, если вы спешите отомстить 😉

Ответ №3:

Попробуйте вот так

 let value =[
    {'id' : 'a', arr : [0,0,1]},
    {'id' : 'b', arr : [1,0,1]},
    {'id' : 'c', arr : [1,4,1]}
   ]
   value.forEach(val=>{
   if(val.id=='a'){
    val.arr=[3,0,1] 
   }
})
  

Комментарии:

1. Это неправильное использование Array.prototype.map() , которое, как ожидается, вернет массив. Чтобы просто перебирать исходный массив, вы должны использовать Array.prototype.forEach()