Javascript :高阶函数

Javascript :higher order functions

我是编码新手,正在练习高阶函数。给出以下问题:

Write a function which will split an array into two arrays (i.e. partition it).

It will take two parameters, the first is an array of Integer values, and the second will be a callback which will return a boolean. If the callback returns true for an element, it should be placed into the left array, otherwise it should be placed into the right array.

Examples:

  • partition([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], n => n % 2 === 0) should look like this: [[2, 4, 6, 8, 10], [1, 3, 5, 7, 9]]
  • partition([-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5], n => n < 0) should look like this: [[-5, -4, -3, -2, -1], [0, 1, 2, 3, 4, 5]]
const partition = function(arr, callback) {
    // IMPLEMENT ME
};

我想到了以下内容:

const array = [];
arr.filter((integers) => {
  if (integers === callback) {
    array.push(integers);
    return integers;
  }
});
};

partition([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], (n) => n % 2 === 0);
partition([-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5], (n) => n < 0);

我卡住了,无法理解如何将 .filter 与回调一起使用,我如何使用 .filter 方式拆分它,你能用 .filter 方法指导我吗以上问题。

您需要为回调筛选 return 为真的值,并收集所有其他值和 return 一个包含筛选值和其他收集值的新数组。

const partition = function(arr, callback) { // IMPLEMENT ME
    const array = [];
    return [
        arr.filter(value => {
            if (callback(value)) return true;
            array.push(value);
        }),
        array
    ];
};

console.log(partition([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], n => n % 2 === 0)); // [[2, 4, 6, 8, 10], [1, 3, 5, 7, 9]]

console.log(partition([-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5], n => n < 0)); // [[-5, -4, -3, -2, -1], [0, 1, 2, 3, 4, 5]]

Array.filter 应该接受 returns 布尔值的回调。如果回调 returns true,它将值保留在结果数组中,如果是 returns false,则不会将其添加到数组中。

如果你想继续使用过滤器,你所拥有的几乎可以工作,除了你正在检查每个元素和回调函数之间的严格相等性,而你应该用 callback(integer).

如果要使用它,还需要将过滤器的输出存储到第二个数组中。

const leftArray = [];
const rightArray = arr.filter((integer) => {
  if (callback(integer)) {
    leftArray.push(integer);
    return false;
  }
  return true;
});

过滤功能只允许您return一个数组匹配一个条件。因此,如果你想用过滤函数构建两个数组,你可以这样使用:

let partition = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let evenPartition = partition.filter(x => x % 2 === 0);
let oddPartition = partition.filter(x => x % 2 !== 0);
//Even partition : [2, 4, 6, 8, 10]
//Odd partition : [1, 3, 5, 7, 9]

您还可以使用地图功能:

let partition = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let finalResult=[[], []];
partition.map(x => {
   if(x % 2 === 0)
      finalResult[0].push(x);
   else
      finalResult[1].push(x);
});

//Final result: [[2, 4, 6, 8, 10], [1, 3, 5, 7, 9]]