减少与过滤和映射的区别

5
我写了一个函数,计算数组 realNumberArray 中正整数的平方,并返回一个新数组作为结果。
例如: [4, 5.6, -9.8, 3.14, 42, 6, 8.34, -2] 返回 [16,1764,36]
您将如何使用 reduce() 重新创建以下函数?最佳方法是什么?

const realNumberArray = [4, 5.6, -9.8, 3.14, 42, 6, 8.34, -2];
const squareList = (arr) => {
  const squaredIntegers = arr;
  let newArr=squaredIntegers.filter(val=>val%1==0 && val>0).map(val=>Math.pow(val,2))
  return newArr;
};
const squaredIntegers = squareList(realNumberArray);
console.log(squaredIntegers);


4
建议保留您使用mapfilter的版本 - 这比您使用reduce时,正在发生什么要明显得多。实际上,这是一个普遍规律 - 您可以使用reduce来做更多或更少的任何事情,而mapfilter则清楚地表明您正在做什么。我想理论上reduce具有更好的性能(因为您只通过一次数组),但除非您处理大型数组并且实际上注意到性能成为问题,否则我不会担心此问题。 - Robin Zigmond
我同意,我更喜欢可读性而不是微小的性能提升,但是如果后来影响了整体速度,请不要忘记对齐您的代码。然而,请注意,在单行减少器中使用扩展运算符甚至仅使用concat也会有昂贵的开销,您可以避免这种情况。如果您想只枚举一次并且不想加热GC,请坚持在reduce内部使用push。 - Jamesgt
8个回答

2
你可以使用reduce来实现,代码如下:reduce文档

const squareList = arr =>
  arr.reduce((out, x) => x % 1 === 0 && x > 0 ? [...out, x * x] : out, []);

console.log(squareList([4, 5.6, -9.8, 3.14, 42, 6, 8.34, -2]));


1

Push to the accumulator only if the test passes:

const realNumberArray = [4, 5.6, -9.8, 3.14, 42, 6, 8.34, -2];
const squareList = arr => arr.reduce((a, val) => {
  if (val % 1 == 0 && val > 0) {
    a.push(val ** 2);
  }
  return a;
}, []);
const squaredIntegers = squareList(realNumberArray);
console.log(squaredIntegers);


0
您可以通过以下方式实现这一点:

const realNumberArray = [4, 5.6, -9.8, 3.14, 42, 6, 8.34, -2];

const result = realNumberArray.reduce((a, i) => Number.isInteger(i) && i > 0 ? a.concat([ i ** 2 ]) : a, [])

console.log(result)

为了更好地理解,上面的代码将输入数组realNumberArray缩减到result数组中,其中每次缩减迭代:

  1. 如果正在迭代的输入值是整数,则通过Number.isInteger(number)进行“过滤”。 如果数字i是整数,则代码
  2. 继续通过此a.concat([ i ** 2 ])将该数字的“平方”连接到输出数组a中(请注意,number ** 2Math(number, 2)的简写)
  3. 如果i不是整数,则通过直接返回该迭代的当前输出数组a来将其过滤掉

希望这可以帮助你!


0
使用 reduce

const realNumberArray = [4, 5.6, -9.8, 3.14, 42, 6, 8.34, -2];
const squareList = (arr) => {
  const squaredIntegers = arr;
  let newArr = squaredIntegers.reduce((acc, val) => {
    if (val % 1 == 0 && val > 0) {
      acc.push(Math.pow(val, 2));
      return acc;
    }
    return acc
  }, [])
  return newArr;
};
const squaredIntegers = squareList(realNumberArray);
console.log(squaredIntegers);


0
最好的方式是检查该数字上的 parseFloat()parseInt() 是否相同,以确定给定的数字是否为纯整数。然后,基于您的额外条件,即数字应大于0,在 if 中添加额外条件。

var arr = [4, 5.6, -9.8, 3.14, 42, 6, 8.34, -2] ;
var res = arr.reduce((acc, num) => {
  if(num > 0 && parseFloat(num) === parseInt(num)){
    acc.push(num*num);
  }
  return acc;
}, []);
console.log(res);


0

你可以在非整数值或负数的情况下连接一个空的平方值数组。

const
    realNumberArray = [4, 5.6, -9.8, 3.14, 42, 6, 8.34, -2],
    squareList = array => array.reduce((r, v) => r.concat(v % 1 || v < 0 ? [] : v * v), []),
    squaredIntegers = squareList(realNumberArray);

console.log(squaredIntegers);


0

试试这个

const realNumberArray = [4, 5.6, -9.8, 3.14, 42, 6, 8.34, -2];
const squareList = (arr) => {
  return arr.reduce((a,val)=>{
  if(val%1==0 && val>0)
  a.push(Math.pow(val,2))
  return a;
  },[])
};
const squaredIntegers = squareList(realNumberArray);
console.log(squaredIntegers);


0
使用reduce和数组解构代替push方法。

const realNumberArray = [4, 5.6, -9.8, 3.14, 42, 6, 8.34, -2];

const newArray = realNumberArray.reduce((acc, curr) => (curr % 1 === 0 && curr >= 0 ? [...acc, curr * curr] : acc), []);
console.log(newArray);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接