如何在JavaScript对象数组中新增或更新对象?
食谱数组的新增与更新逻辑实现(基于map函数)
你提到的需求完全可以用map函数实现,不过需要结合存在性判断来区分“新增”和“更新”两种场景,下面直接上实现思路和代码:
核心逻辑
- 以
nome作为食谱的唯一标识,先判断新食谱是否已存在于数组中 - 若已存在:用
map遍历数组,找到对应食谱时仅更新其ingredienti属性,其余元素保持不变 - 若不存在:将新食谱添加到数组中(推荐返回新数组,避免修改原数组产生副作用)
完整代码实现
var ricette = [ { nome: "Carbonara", ingredienti: ["guanciale", "uovo", "sale"], tipologia: "primo", }, { nome: "Amatriciana", ingredienti: ["guanciale", "pecorino", "pomodoro"], tipologia: "primo", }, { nome: "Cacio e Pepe", ingredienti: ["pepe", "pecorino"], tipologia: "primo", }, { nome: "Cicoria", ingredienti: ["aglio", "peperoncino"], tipologia: "contorno", }, { nome: "Tiramisu", ingredienti: ["uovo", "mascarpone", "savoiardo"], tipologia: "dolce", }, ]; // 处理食谱的函数 function gestisciRicetta(ricette, nuovaRicetta) { // 检查数组中是否已有同名食谱 const ricettaEsistente = ricette.some(r => r.nome === nuovaRicetta.nome); if (ricettaEsistente) { // 用map遍历更新:找到对应食谱时替换ingredienti,其余元素原样返回 return ricette.map(r => { if (r.nome === nuovaRicetta.nome) { // 返回新对象,不修改原数组元素(更安全的写法) return { ...r, ingredienti: nuovaRicetta.ingredienti }; } return r; }); } else { // 不存在则返回包含原数组+新食谱的新数组 return [...ricette, nuovaRicetta]; } }
使用示例
1. 更新已有食谱的食材
// 更新Tiramisu的食材,添加"caffè" const ricetteAggiornate = gestisciRicetta(ricette, { nome: "Tiramisu", ingredienti: ["uovo", "mascarpone", "savoiardo", "caffè"], tipologia: "dolce" }); // 查看更新后的结果 console.log(ricetteAggiornate.find(r => r.nome === "Tiramisu").ingredienti); // 输出:["uovo", "mascarpone", "savoiardo", "caffè"]
2. 添加全新食谱
// 添加你示例中的"Tofu panato" const ricetteConNuova = gestisciRicetta(ricette, { nome: "Tofu panato", ingredienti: ["farina", "pangrattato", "olio"], tipologia: "secondo" }); console.log(ricetteConNuova.length); // 输出:6(原数组5个+新增1个)
关于map函数的说明
map本身是用来遍历数组并返回新数组的工具,它不会直接帮你判断元素是否存在,但结合some做存在性检查后,就可以用它来精准更新数组中的特定元素。这种写法属于纯函数(不修改原数组,仅返回新数组),能避免意外的副作用,是更推荐的前端编程习惯。
内容的提问来源于stack exchange,提问作者Malinowa
相关产品推荐
相关产品推荐

