如何在Array.filter中提取非active对象的id组成数组?
解决方法:分离筛选与ID收集,或用Reduce一次完成
嘿,我懂你的困扰了——你现在在filter回调里尝试收集非active对象的ID,但每次进入else分支都重置ids数组,而且filter本身的定位是筛选数组元素,不是用来做“收集数据”这种副作用操作的,这就导致你的代码没法得到完整的非active ID数组对吧?
为什么你的当前代码不行?
你在else里写了ids = [],这意味着每遇到一个非active对象,都会把之前收集的ID清空,最后ids里只会剩下最后一个非active对象的ID。而且用filter来做收集操作,违背了这个方法的设计初衷,代码可读性也会变差。
方案1:职责分离(推荐,代码更清晰)
把“筛选active对象”和“收集非active ID”分成两个独立的操作,这样逻辑一目了然:
const arrayList = [ { id: 48589, height: 5.8, active: false }, { id: 84697, height: 4.6, active: true }, { id: 887697, height: 5.0, active: true } ]; // 第一步:筛选出active的对象,供你处理其他属性 const activeItems = arrayList.filter(item => item.active); // 第二步:收集所有非active对象的ID到数组 const inactiveIds = arrayList .filter(item => !item.active) // 先过滤出非active的对象 .map(item => item.id); // 再提取它们的id // 接下来你就可以用activeItems处理业务逻辑,用inactiveIds去查询数据库了
方案2:用Reduce一次遍历完成(适合大数据量优化)
如果你担心遍历两次数组影响性能(比如数组特别大),可以用reduce方法在一次遍历里同时完成筛选和收集:
const arrayList = [ { id: 48589, height: 5.8, active: false }, { id: 84697, height: 4.6, active: true }, { id: 887697, height: 5.0, active: true } ]; const result = arrayList.reduce((acc, item) => { if (item.active) { acc.activeItems.push(item); // 这里可以直接处理item的其他属性,比如你之前的业务逻辑 } else { acc.inactiveIds.push(item.id); } return acc; }, { activeItems: [], inactiveIds: [] }); // 解构出需要的结果 const { activeItems, inactiveIds } = result;
小提醒
除非你的数组规模特别大,否则方案1的性能差异完全可以忽略,而且代码更易读、易维护,是更推荐的写法。
内容的提问来源于stack exchange,提问作者Hopez
相关产品推荐
相关产品推荐

