在javascript中,在一个函数中过滤和映射数组?

时间:2019-12-07 03:16:30

标签: javascript arrays

在Javascript中,Array.filter()接受一个数组,并根据特定条件对其进行过滤。

const a = [1,2,3,4,5].filter(el => el > 3);
console.log(a);

结果:[4,5]

Array.map()接受一个数组并返回一个等长的新数组,通常会在过程中改变原始元素。

const a = [1,2,3,4].map(el => el + 10);
console.log(a);

结果:[11,12,13,14,15]

我的问题是,除了将这两个功能结合起来之外:

let a = [1,2,3,4,5].filter(el => el > 3).map(el => el + 10);
console.log(a);

是否有一种有效的方法来过滤和变异数组,而不像大多数Array.forEachforfor..in例程那样涉及多行代码?我知道Array.filter().map()效率很高,我想知道是否可以进一步简化它。

1 个答案:

答案 0 :(得分:2)

使用Array.prototype.reduce可以一次完成所有过滤和映射。

let a = [1,2,3,4,5].reduce((arr, el) => el > 3 ? arr.concat(el + 10) : arr, []);
console.log(a);

您还可以创建自己的mapIf polyfill函数。

// Reduce Only
if (Array.prototype.mapIf === undefined) {
  Array.prototype.mapIf = function(predicateFn, applyFn) {
    return this.reduce((ref, el) => predicateFn(el) ? ref.concat(applyFn(el)) : ref, []);
  };
}

// Filter + Map
if (Array.prototype.mapIf === undefined) {
  Array.prototype.mapIf = function(predicateFn, applyFn) {
    return this.filter(predicateFn).map(applyFn);
  };
}


let a = [1,2,3,4,5].mapIf(el => el > 3, el => el + 10);
console.log(a);