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

React JS:如何从对象数组的嵌套对象中删除单个条目?

解决方案

你的问题出在deleteItem函数里用了filter直接过滤整个standup对象——只要某个对象的yesterday.id匹配目标id,就会把包含yesterday和today的整个对象从数组中移除,自然会同时删掉两个条目。

要实现仅删除单个条目,你需要遍历每个standup对象,只移除匹配id的那个属性(yesterday或today),而不是删掉整个对象。修改后的deleteItem函数如下:

function deleteItem(id) {
  setAllStandups(prevStandups => {
    // 遍历每个standup对象,单独处理条目删除
    return prevStandups.map(standup => {
      const newStandup = { ...standup };
      
      // 删除匹配id的yesterday条目
      if (newStandup.yesterday?.id === id) {
        delete newStandup.yesterday;
      }
      // 删除匹配id的today条目
      if (newStandup.today?.id === id) {
        delete newStandup.today;
      }
      
      return newStandup;
    }).filter(standup => {
      // 过滤掉处理后为空的对象,避免数组残留无效数据
      return Object.keys(standup).length > 0;
    });
  });
}

代码说明:

  1. map遍历处理单个对象:不对整个数组做过滤,而是逐个处理每个standup对象,保留未被删除的条目。
  2. 精准删除目标条目:通过判断yesterday或today的id是否匹配,只移除对应的属性,不会影响同对象下的另一个条目。
  3. 过滤空对象:如果某个standup对象的两个条目都被删除(极端情况),会被过滤出数组,保证数组数据有效性。

如果想让代码更简洁,也可以用对象解构的方式实现:

function deleteItem(id) {
  setAllStandups(prev => prev.map(item => {
    const newItem = {};
    if (item.yesterday?.id !== id) newItem.yesterday = item.yesterday;
    if (item.today?.id !== id) newItem.today = item.today;
    return newItem;
  }).filter(item => Object.keys(item).length > 0));
}

注意:要确保每个yesterday和today的id是全局唯一的,避免一次误删多个条目。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 16:10:23