如何遍历包含嵌套数组的对象数组,判断是否存在满足指定条件的条目?
如何检查数组中是否存在满足条件的对象条目?
你完全不需要嵌套for循环,JavaScript的数组方法里有更简洁高效的方案——Array.some() 就是专门干这个的!它的语义正好匹配你的需求:判断数组中是否存在至少一个满足条件的元素,而且找到第一个符合条件的元素后就会停止遍历,性能比filter或者全量循环要好。
你的需求是:检查weeklyTimes数组里的每一天,只要某一天的startEnd数组中存在一个条目满足:
weeklyFlag为trueweeklyStartTime不为nullweeklyEndTime不为null
就返回true。用some()可以两层嵌套实现这个逻辑,代码非常清晰:
let weeklyTimes = [ { "day": "Monday", "startEnd": [ { "weeklyFlag": true, "weeklyStartTime": null, "weeklyEndTime": null } ] }, { "day": "Tuesday", "startEnd": [ { "weeklyFlag": true, "weeklyStartTime": "2021-08-08T14:00:00.000Z", "weeklyEndTime": "2021-08-08T15:00:00.000Z" } ] }, { "day": "Wednesday", "startEnd": [ { "weeklyFlag": false, "weeklyStartTime": null, "weeklyEndTime": null } ] }, { "day": "Thursday", "startEnd": [ { "weeklyFlag": false, "weeklyStartTime": null, "weeklyEndTime": null } ] }, { "day": "Friday", "startEnd": [ { "weeklyFlag": false, "weeklyStartTime": null, "weeklyEndTime": null } ] }, { "day": "Saturday", "startEnd": [ { "weeklyFlag": false, "weeklyStartTime": null, "weeklyEndTime": null } ] }, { "day": "Sunday", "startEnd": [ { "weeklyFlag": false, "weeklyStartTime": null, "weeklyEndTime": null } ] } ]; const hasValidEntry = weeklyTimes.some(dayItem => { // 检查当前天的startEnd数组中是否有符合条件的条目 return dayItem.startEnd.some(entry => { return entry.weeklyFlag && entry.weeklyStartTime !== null && entry.weeklyEndTime !== null; }); }); console.log(hasValidEntry); // 输出: true
为什么选some()而不是map/filter?
map()是用来转换数组元素的,它会返回一个新数组,不适合用来做存在性判断;filter()会遍历整个数组并返回所有符合条件的元素组成的新数组,然后你需要判断filterResult.length > 0,虽然能实现,但some()在找到第一个符合条件的元素后就会停止遍历,效率更高,而且语义更直接——我们要的就是“是否存在”,而不是“所有符合条件的元素”。
如果你的startEnd数组可能包含多个条目,这个逻辑也能完美处理,只要其中一个条目满足条件就会返回true。
内容的提问来源于stack exchange,提问作者ArthurJ
相关产品推荐
相关产品推荐

