【问题标题】:How do I write all iterations of reduce to an array?如何将reduce的所有迭代写入数组?
【发布时间】:2021-11-17 19:08:50
【问题描述】:

脚本背后的思想如下: 我通过从中删除所有偶数值来过滤原始数组。接下来,我将原始数组的部分乘积组成一个新数组:

// new first element = 1 * 3;
// second = (first (previous multiplication) * current value) = 3 * 3 (9);
// third = (previous product * current value) = 9 * 9 (81)

我得到了我想要的结果,但我的输出看起来不像一个数组:

Input:
3 3 9

Output:
3
9
81

请帮我画出以下输出:

Input:
3 3 9

Output:
3 9 81

function modify(arr) {
  var result = [];

  arr = arr.filter(item => !(item % 2 == 0))
    .reduce(function(acc, curItem) {
      console.log(acc * curItem);
      return acc * curItem;
    }, 1)

  for (let i = 0; i < result.length; i++) {
    arr.push(result[i]);
  };
  return result;
}

console.log( modify([3,3,9]) )

【问题讨论】:

  • result 始终为空。因此,for 循环的主体永远不会被执行。
  • 您的脚本中拥有您需要的一切。试一试,再看看.reduce() 的工作原理以及文档中的示例。您不仅可以返回一个数字。
  • @EdwinDalorzo 这不是问题所在。这也会通过引入一个不必要的全局变量使return result 无用。

标签: javascript arrays ecmascript-6 amazon-emr reduce


【解决方案1】:

您可以使用reduce 跟踪您的累积产品和最终数组:

const input = [3, 3, 9];

const output = input.reduce( (acc,val) => {
   const newResult = acc.cum * val;
   acc.result.push(newResult);
   acc.cum = newResult;
   return acc;
},{cum:1, result:[]});

console.log(output.result);

由于数组的最后一个元素总是累积积,你也可以这样写:

const input = [3, 3, 9];

const output = input.reduce( (acc,val) => {
   const newResult = (acc.length ? acc[acc.length-1] : 1) * val;
   acc.push(newResult);
   return acc;
},[]);

console.log(output);

这取决于你觉得哪一个更容易使用。

【讨论】:

  • cumresult 中的最后一个条目相同
  • @Andreas 它适用于除需要 1 的第一次迭代之外的所有内容。我想我可以这样做 acc.length ? acc[length-1] : 1,但我认为这种方式更清晰。
  • 或者使用索引,也就是.reduce()的第三个参数
  • “我想我可以做到acc.length ? acc[length-1] : 1 ...或acc.slice(-1)[0] ?? 1或已经建议的idx参数。
【解决方案2】:

使用Array#reduce() 方法和spread 运算符,您可以按照以下演示转换您的数组:

let modify = (arr) => arr.reduce((acc,cur,i) => [...acc, (acc[i-1] || 1) * cur],[]);

console.log( modify([3,3,9]) );

或者简单地说:

function modify(arr) {
    return arr.reduce(function(acc,cur,i) { 
        return [...acc, (acc[i-1] || 1) * cur] 
    }, []);
}

console.log( modify([3,3,9]) );

或者如果这是运行一次的代码,在这种情况下你不需要函数:

let oldArray = [3,3,9];

let newArray = oldArray.reduce(function(acc,cur,i) { 
    return [...acc, (acc[i-1] || 1) * cur] 
}, []);

console.log( newArray );

【讨论】:

  • 非常感谢!!)
  • @ИльяКалошин 如果您发现其中一个或两个有用,请随时支持 (^) 此或其他答案。如果它可以帮助您解决问题,您也可以接受其中一个答案作为答案。
  • 我点击投票但没有任何变化。这是我第一次上 Stack。
猜你喜欢
  • 2017-02-01
  • 2019-12-04
  • 1970-01-01
  • 2016-01-21
  • 2020-07-21
  • 2017-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多