#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()