javascript – 通过过滤功能划分数组

我有一个 Javascript数组,根据每个元素上调用函数是否返回true或false,我想将其分成两部分.本质上来说,这是一个array.filter,但是我也想手边的过滤掉的元素.

目前,我的计划是使用array.forEach并在每个元素上调用谓词函数.根据这是真还是假,我将把当前元素推送到两个新的数组之一.有没有更优雅或更好的方式来做到这一点?一个array.filter,它会在返回false之前将元素推送到另一个数组上?

解决方法

这听起来非常类似于 Ruby’s Enumerable#partition方法.

如果该函数不具有副作用(即它不能改变原始数组),则没有更有效的方法来分割数组,而不是遍历每个元素,并将元素推送到您的两个数组之一.

话虽如此,在Array上创建一个方法来执行这个功能可以说更为“优雅”.在这个例子中,过滤器函数是在原始数组的上下文中执行的(即这将是原始数组),它接收元素的元素和索引作为参数(类似于jQuery’s each method):

Array.prototype.partition = function (f){
  var matched = [],unmatched = [],i = 0,j = this.length;

  for (; i < j; i++){
    (f.call(this,this[i],i) ? matched : unmatched).push(this[i]);
  }

  return [matched,unmatched];
};

console.log([1,2,3,4,5].partition(function (n,i){
  return n % 2 == 0;
}));

//=> [ [ 2,4 ],[ 1,5 ] ]

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...