我有一个函数,该函数将数字数组作为参数。我想返回一个包含每个数字乘积的新数组,当前索引处的数字除外。
例如,如果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!'
我的代码有什么问题?
答案 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..in
与for..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 ) ) )