如何优雅过滤嵌套对象数组,移除含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
相关产品推荐
相关产品推荐

