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; }); }); }
代码说明:
map遍历处理单个对象:不对整个数组做过滤,而是逐个处理每个standup对象,保留未被删除的条目。- 精准删除目标条目:通过判断
yesterday或today的id是否匹配,只移除对应的属性,不会影响同对象下的另一个条目。 - 过滤空对象:如果某个
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
相关产品推荐
相关产品推荐

