数组中所有其他数字的乘积

时间:2019-03-11 14:09:35

标签: javascript arrays for-loop

我有一个函数,该函数将数字数组作为参数。我想返回一个包含每个数字乘积的新数组,当前索引处的数字除外。

例如,如果arr有5个索引,而我们正在创建索引1的值,则索引0、2、3和4的数字将相乘。

这是我编写的代码:

function getProducts(arr) {
let products = [];
for(let i = 0; i < arr.length; i++) {
    let product = 0;
    for(let value in arr.values()) {
      if(value != arr[i]) {
        product *= value;
      }
    }
    products.push(product);
}
return products;
}
getProducts([1, 7, 3, 4]);
// Output ➞ [0, 0, 0, 0]
// Expected output ➞ [84, 12, 28, 21]

如您所见,所需的输出未实现。我做了一些实验,似乎第二个for循环从未真正启动过,因为我放入该块中的任何代码都不会执行:

function getProducts(arr) {
let products = [];
for(let i = 0; i < arr.length; i++) {
    let product = 0;
    for(let value in arr.values()) {
      console.log('hello!');
      if(value != arr[i]) {
        product *= value;
      }
    }
    products.push(product);
}
return products;
}
getProducts([1, 7, 3, 4]);
// Output ➞ 
// Expected Output ➞ 'hello!'

我的代码有什么问题?

4 个答案:

答案 0 :(得分:2)

您可以取所有数字的乘积,然后除以索引号,得到除实际值以外的所有数字的乘积。

select
*
from    DatabaseTables

使用零为零的数组的更可靠方法。如果一个数组有多个零,则所有乘积均为零。

以下方法将index处的值替换为1。

function getProducts(array) {
    var product = array.reduce((a, b) => a * b, 1);
    return array.map(p => product / p);
}

console.log(getProducts([1, 7, 3, 4]));

答案 1 :(得分:1)

您只需要将in关键字更改为of关键字。 for..infor..of不同。

arr.values()返回一个迭代器,该迭代器必须使用of关键字进行迭代。

此外,如果product = 0,则所有乘法将返回0。

由于不检查当前索引,但是您检查要乘的值是否不同于当前值,因此该代码容易出错。如果在数组中重复相同的数字,则会导致问题。

现在,我们谈论好的做法有点奇怪,首先您使用for(var i...循环遍历数组,而第二次使用for...in/of进行遍历。

我已经为您修复了代码:

function getProducts(arr) {
    let products = [];
    for(let i = 0; i < arr.length; i++) {
        let product = 1;
        for(let ii = 0; ii < arr.length; ii++) {
            if(i != ii) {
                product *= arr[ii];
            }
        }
        products.push(product);
    }
    return products;
}

答案 2 :(得分:1)

一种更好的方法是获得总乘积,然后使用map()total除以每个值

function getProducts(arr){
  let total = arr.reduce((ac,a) => ac * a,1);
  return arr.map(x => x === 0 ? total : total/x);
}
console.log(getProducts([1, 7, 3, 4]))

答案 3 :(得分:0)

说明:将 i 中的数字替换为 1 ,这样它就不会干扰。另外,在 a 副本上应用填充,因此将 [... a]

console.log( [2,3,4,5].map( (n,i,a) => [...a].fill(1,i,i+1).reduce( (a,b) => a*b ) ) )