在数组中将所有元素相乘

43

我在这里找不到我真正想要的示例。

我想把数组中的所有元素相乘,所以如果一个数组包含[1,2,3],那么它们的和应该是123=6;

到目前为止,我的代码是这样的,但它返回undefined。

function multiply (array) {
    var sum=1;
    for (var i=0; i<array.length; i++) {
        sum = sum * array[i];
    } 
    return sum;
}
console.log(multiply[1,2,3]);

有谁能够解释一下,我错过了什么?


9
你的最后一行应该像这样 console.log(multiply([1,2,3])); - MonkeyCoder
11个回答

70

已知原因。这里有一个替代方案 - 使用 Array.reduce 方法:

console.log( [1, 2, 3].reduce( (a, b) => a * b ) );
console.log( Array.from( {length: 20} )
  .map( (v, i) => i + 1 )
  .reduce( (a,b) => a * b, 1 )
  .toLocaleString());

// for empty arrays, use some initial value
const arr = [];
if (arr.reduce( (a, b) => a * b, -1 ) === -1) {
  console.error(`The given array ${arr} is empty`);
}

另请参阅


别忘了检查你所需的浏览器是否支持 Array.reduce:http://kangax.github.io/compat-table/es5/#Array.prototype.reduce。否则,lodash/underscore 的 _.reduce 是一个不错的选择。 - Darren Shewry
14
ES6: [1, 2, 3].reduce((a, b) => a * b); 可以翻译为“ES6:将数组 [1, 2, 3] 中的元素依次相乘,最终得到一个结果”。 - Bugs Bunny
1
我想要一个简单的解决方案,就像使用算法和更多的代码一样,这样我才能理解整个过程,而不是直接使用“reduce”函数。 - Hussein Al-Mosawi
@HusseinAl-Mosawi 答案中的链接提供了关于 Array.reduce 工作原理的充足信息。我建议你仔细研究那个页面。 - KooiInc
1
@KiranKumar 你不能从reduce lambda中跳出。但是你可以使用[1, 2, 0, 3].reduce( (a, b) => b > 0 ? a * b : 0, 1)来实现相同的功能。 - KooiInc
显示剩余3条评论

18

使用Array.reduce的另一种方法应将初始值设置为1,否则我们的函数将无论如何返回0。

[1, 2, 3].reduce((a, b)=> a*b, 1)

通过Array.reduce()方法实现


3
如果没有提供初始值,数组中的第一个值将充当初始值,所以以下方式也可以正常工作:[1, 2, 3].reduce((a, b)=> a*b) - hb20007

9

在调用函数时需要加上 ()

例如:multiply([1,2,3])

演示可以在这里查看。


@JohSmith,很高兴我可以帮到你。有许多人查看代码总是很好的 :) - Sergio

3

您没有将multiply作为函数调用:

multiply([1,2,3]);

2
reduce()方法对数组的每个值执行提供的函数,并将数组减少为单个值。

    const arr = [1,2,3];
    const sum = arr.reduce((prevValue,curValue) => {
        return prevValue * curValue
    },1);
    console.log(sum);

prevValue是初始值,在此示例中等于1

curValue是数组中当前元素的值


2
这是在数组上执行任何算术运算的最简单方法。

myMathArray = [1,2,3,4,5]
let myValue = myMathArray.reduce((a,b)=> a*b)
console.log(myValue)


1

如果您想要计算一些连续数字(例如1、2、3)的乘积,那么请使用以下代码,并在控制台中输入数字(arr)。

let array = [];

function factorisation(arr) {
    for (let j = arr; j > 0; j--) {
        array.push(j);
    }
    return multiply();
}

function multiply() {
    var sum = 1;
    for (var i = 0; i < array.length; i++) {
        sum = sum * array[i];
    }
    return sum;
}

console.log(factorisation(5));
//5*4*3*2*1 = 120

1

如果您想使用递归

const productOfArray = (arr) => {
  if (arr.length === 0) {
    return 1;
  }
  return arr[0] * productOfArray(arr.slice(1));
}

console.log(productOfArray([1,2,3,10])); // 60


1
使用Lodash >=4.7:
_.reduce(array, _.multiply)

或者,使用所有三个参数:
_.reduce(array, _.multiply, 1)

0

这可以使用递归来简化...

    function productOfArray(arr) {

    let sum = 1;
    
    function sumHelper(nums) {

        if(nums.length === 0)
        return 0;

        sum = sum * nums[nums.length-1];
        nums.length--;
        
        sumHelper(nums);
        
    }

    sumHelper(arr);
    
    return sum;
    
}

console.log(productOfArray([1,2,3])); 

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