减少vs过滤和地图

问题描述 投票:1回答:8

我编写了一个函数来计算数组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);
javascript
8个回答
0
投票

只有在测试通过时才推送到累加器:

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
投票

使用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
投票

您可以通过以下方式实现此目的:

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数组,其中每个reduce迭代:

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

希望有所帮助!


0
投票

你可以用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]));

0
投票

使用reduce和Array解构代替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);
© www.soinside.com 2019 - 2024. All rights reserved.