如何用Underscore.js不修改原变量,拆分含指定值的对象数组?
使用Underscore.js分离数组中符合条件的对象(不修改原数组)
刚好遇到过类似的需求,Underscore.js里的_.partition方法简直是为这个场景量身定做的!它能一次性把数组分成符合条件和不符合条件的两个新数组,而且完全不会修改原数组,完美匹配你的要求。
完整实现代码
// 原数组(保持不变) const existOriginal = [ {"x":6811,"y":15551,"a":["aa","ab","ac"]}, {"x":6811,"y":15552,"a":["bb"]}, {"x":6812,"y":15551,"a":["aa","cc"]} ]; // 用_.partition分离出目标对象 const [found, exist] = _.partition(existOriginal, item => { // 判断当前对象的a数组是否包含"aa" return _.includes(item.a, 'aa'); });
代码解释
_.partition:Underscore的核心方法,接收原数组和一个判断函数,返回两个新数组:第一个是所有满足判断条件的元素,第二个是不满足的元素。整个过程不会改动原数组existOriginal。_.includes:用来检查数组中是否包含指定值,这里用来判断每个对象的a数组里有没有"aa",比手动写循环更简洁可靠。- 解构赋值:直接把
_.partition返回的两个数组分别赋值给found和exist,代码更清爽。
验证结果
运行后你会得到:
exist=[{"x":6811,"y":15552,"a":["bb"]}](原数组中排除符合条件的对象)found=[{"x":6811,"y":15551,"a":["aa","ab","ac"]},{"x":6812,"y":15551,"a":["aa","cc"]}](所有包含"aa"的对象)
替代方案(如果不用partition)
如果习惯分开写,也可以用_.filter和_.reject组合,不过这个方法会遍历数组两次,效率稍低:
const found = _.filter(existOriginal, item => _.includes(item.a, 'aa')); const exist = _.reject(existOriginal, item => _.includes(item.a, 'aa'));
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

