You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Underscore更新嵌套JSON时如何避免原有内容丢失?

解决contentItems更新时覆盖原有数据的问题

我看了你的代码,问题出在这一行:

item.contentItems = updatedContentItem ;

你原来的contentItems是一个数组(从你的JSON结构能看到它包含nested 1和nested 2两个元素),但你这里直接把整个数组替换成了单个updatedContentItem对象,这就导致原来数组里的其他元素全部被清空了。

要解决这个问题,你需要找到数组中要更新的具体元素,修改它的属性,而不是替换整个数组。下面是具体的修改方案:

步骤1:定位要更新的contentItem元素

首先,你需要在contentItems数组里找到你要更新的那一项。因为你的数据里没有给contentItem加唯一id,暂时可以通过name来匹配(建议后续给每个contentItem添加唯一id,这样匹配会更可靠)。

如果你的表单里没有存储原始的contentItem名称,建议加个隐藏字段来保存,避免用户修改名称后找不到要更新的项:

<!-- 在你的编辑表单里添加这个隐藏字段,赋值为要更新的原始name -->
<input type="hidden" id="originalContentItemName" value="nested 1">

步骤2:修改更新逻辑

把你原来替换数组的代码,改成遍历contentItems并更新对应项的逻辑:

_.each(jsonData.itemsList, function (item) {
  if (item.id === resourceId) {
    item.contentName = updatedContentName;
    
    // 获取要更新的原始名称(从隐藏字段取)
    var originalContentItemName = $("#editResourceItemForm input#originalContentItemName").val().trim();
    // 遍历contentItems数组,找到目标项
    _.each(item.contentItems, function(contentItem, index) {
      if (contentItem.name.trim() === originalContentItemName) {
        // 直接修改现有对象的属性,保留数组其他元素
        contentItem.name = $("#editResourceItemForm input#contentItemName").val();
        contentItem.description = CKEDITOR.instances.contentItemDescription.getData();
      }
    });
  }
});

为什么这样能解决问题?

原来的代码是直接把contentItems数组整个替换成单个对象,相当于把[item1, item2]变成了item1,自然丢失了item2。而修改后的逻辑是在原数组里找到要更新的元素,只修改它的属性,数组里的其他元素会被完整保留。

如果之后你需要新增contentItem,才用item.contentItems.push(updatedContentItem)来添加,而不是替换整个数组。

内容的提问来源于stack exchange,提问作者Ricardo Alves

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:33:28