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

如何优雅过滤嵌套对象数组,移除含null的时间块属性?

问题:优雅过滤嵌套数组中的无效时间块

我有一个包含工作日对象的嵌套数组,想要过滤掉其中opens或closes属性为null的元素,而且必须返回一个新数组,绝对不能修改原数组。

原始数组示例:

let array = [ 
  [ {"weekday":1,"opens":"09:00","closes":"11:00"}, {"weekday":1,"opens":null,"closes":null} ], 
  [ {"weekday":2,"opens":"09:00","closes":"11:00"}, {"weekday":2,"opens":"12:30","closes":"17:00"}, {"weekday":2,"opens":"18:00","closes":"null"} ], 
  // ... 更多子数组
];

我目前的解决方案能实现需求,但总觉得代码不够简洁优雅:

let newArray = []; 
array.forEach( (day, index) => { 
  day = day.filter( timeblock => timeblock.opens != null && timeblock.closes != null ); 
  newArray.push(day); 
});

想请教下,有没有更优雅的方式来处理这个嵌套数组的过滤?


优雅的解决方案

当然有!你可以用Array.prototype.map()结合filter()来实现,一行代码就能搞定,而且完全满足不修改原数组的要求:

const newArray = array.map(day => day.filter(timeblock => timeblock.opens != null && timeblock.closes != null));

为什么这个写法更优雅?

  • 不修改原数组:map()方法会返回一个全新的数组,原数组的结构和内容完全不受影响,完美符合你的需求
  • 函数式编程风格:用链式调用替代手动创建空数组再push的操作,逻辑更连贯,代码更简洁
  • 可读性更强:一眼就能看明白是对每个工作日的子数组,过滤掉opens或closes为null的时间块

如果想要更严谨的严格相等判断(虽然!= null已经能同时排除null和undefined),可以改成这样:

const newArray = array.map(day => day.filter(timeblock => timeblock.opens !== null && timeblock.closes !== null));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:35:01