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

JavaScript中如何过滤对象,保留isOpen字段及itemId非空的items项

filter处理嵌套数组时丢失外层字段问题解决

我在使用filter方法进行数据处理时遇到了问题。

初始对象

当前待处理的对象结构如下:

[{
  isOpen : true,
  items : [
    {itemId : '', name : 'some name'},
    {itemId : 'new', name : 'new name'}
  ]
},]

预期结果

需要保留对象的isOpen字段,同时仅保留items数组中itemId不为空字符串的子项,预期输出结构如下:

[{
  isOpen : true,
  items : [
    {itemId : 'new', name : 'new name'}
  ]
},]

问题原因

之前的实现代码:

const removeEmptyStringInItems = (item) => item.items?.filter((v) => v.itemId);
const finalItems = myItems.map(removeEmptyStringInItems);

实际仅输出了过滤后的items项:

{itemId : 'new', name : 'new name'}

核心问题是map的回调函数只返回了过滤后的items数组,没有保留外层对象的其他属性,最终生成的数组直接替换成了items的内容,自然丢失了外层的isOpen字段。

正确实现

遍历外层数组时,返回一个和原对象结构一致的新对象,保留原有所有字段,仅对items字段做过滤替换即可:

const finalItems = myItems.map((item) => {
  return {
    // 展开原对象的所有属性,保留isOpen等外层字段
    ...item,
    // 替换items为过滤后的结果,显式判断itemId非空更严谨
    items: item.items?.filter(v => v.itemId !== '')
  }
})

如果确定itemId只会是字符串类型,也可以简写为v => v.itemId,空字符串本身是falsy值可以被过滤掉,但显式写判断条件可以避免后续itemId出现0、false等合法falsy值时被误过滤。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 02:27:16