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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:04:00