问题是:
"编写一个addingAllTheWeirdStuff函数,将array2中所有奇数的和与array1中10以下的每个元素相加。类似地,addingAllTheWeirdStuff也应该将array2中所有偶数的和与array1中大于10的元素相加。
附加:如果array2中的任何元素大于20,则对array1中的每个元素加1。">
我让第一部分起作用了。我似乎不知道如何让第二部分工作。以下是我尝试过的:
function addingAllTheWeirdStuff(array1, array2){
// ADD CODE HERE
let sumOdd = 0;
let sumEven = 0;
for (let i = 0; i < array2.length; i++) {
if (array2[i] % 2 !== 0) {
sumOdd += array2[i];
} else {
sumEven += array2[i];
}
}
for (let i =0; i < array1.length; i++) {
if (array1[i] < 10) {
array1[i] += sumOdd;
} else if (array1[i] > 10) {
array1[i] += sumEven;
}
for (let i =0; i < array2.length; i++) {
if (array2[i] > 20) {
for (let i =0; i < array1.length; i++) {
array1[i] += 1;
return array1;
}
return array1;
}
}
return array1;
}
关于如何使问题的最后一部分起作用,有什么建议吗?提前感谢。
首先,我删除了一些不必要的大括号,并对它们进行了平衡,使其更具可读性(至少对我来说)
然后我删除了你的最后一个嵌套循环,因为它是不必要的和低效的。当你循环array2
得到sumOdd
&sumEven
您可以同时检查是否有任何元素是>20
并将其存储在变量(greaterThan20
)中。然后,当添加总和时,您可以检查相同的变量以添加1
function addingAllTheWeirdStuff(array1, array2) {
// ADD CODE HERE
let sumOdd = 0;
let sumEven = 0;
let greaterThan20 = false; // false by default
for (let i = 0; i < array2.length; i++) {
if (array2[i] % 2 !== 0)
sumOdd += array2[i];
else
sumEven += array2[i];
if (array2[i] > 20)// check if any element > 20
greaterThan20 = true;
}
for (let i = 0; i < array1.length; i++) {
if (array1[i] < 10)
array1[i] += sumOdd;
else if (array1[i] > 10)
array1[i] += sumEven;
if (greaterThan20)// add the +1 if greater than 20
array1[i] += 1;
}
return array1;
}
您在错误的地方使用return
,导致函数在第一个number>20
之后停止,而不是继续所有数字
你也可以合并第一个和最后一个循环,我只是把它保留成这样,这样更清楚
function addingAllTheWeirdStuff(array1, array2) {
// ADD CODE HERE
let sumOdd = 0;
let sumEven = 0;
for (let i = 0; i < array2.length; i++) {
if (array2[i] % 2 !== 0) {
sumOdd += array2[i];
} else {
sumEven += array2[i];
}
}
for (let i = 0; i < array1.length; i++) {
if (array1[i] < 10) {
array1[i] += sumOdd;
} else if (array1[i] > 10) {
array1[i] += sumEven;
}
}
// moved this outside of the above loop
for (let i = 0; i < array2.length; i++) {
if (array2[i] > 20) {
for (let i = 0; i < array1.length; i++) {
array1[i] += 1;
// return array1; remove this line
}
}
}
return array1; // now return
}
你就快成功了。在测试奇数或偶数时,您还可以测试>20
。在第二个循环中,把这些数字也加起来。
function addingAllTheWeirdStuff(array1, array2){
let sumOdd = 0;
let sumEven = 0;
// ==> EXTRA VARIABLE
let great20 = 0;
for (let i = 0; i < array2.length; i++) {
if (array2[i] % 2 !== 0) {
sumOdd += array2[i];
} else {
sumEven += array2[i];
}
// ===> TEST if >20, If so, add one;
if(array2[i] > 20) ++great20;
}
for (let i =0; i < array1.length; i++) {
// ==> ADD great 20
array1[i] += great20;
if (array1[i] < 10) {
array1[i] += sumOdd;
} else if (array1[i] > 10) {
array1[i] += sumEven;
}
return array1;
}
return array1;
}
正如有人指出的那样,在你的代码中,你的内部循环中有一个返回语句,它正在跳出循环。
我还在这里添加了一个替代解决方案,只是为了多样性。首先用滤波和约简计算奇偶和。我还要检查是否有大于20的元素。基于arr2的真/假值。有时,我映射到arr1
const arr1 = [4, 5, 6, 7, 8, 9, 10, 11, 12]
const arr2 = [6, 7, 8, 9, 10, 11, 12, 13, 14, 21]
function addingAllTheWeirdStuff(arr1, arr2) {
let oddSum = arr2.filter(el => el % 2 != 0).reduce((a, n) => a + n)
let evenSum = arr2.filter(el => el % 2 == 0).reduce((a, n) => a + n)
const over20 = arr2.some(el => el > 20)
if (over20) {
return arr1.map(el => el > 10 ? el += ++evenSum : el += ++oddSum)
} else {
return arr1.map(el => el > 10 ? el += evenSum : el += oddSum)
}
}
console.log(addingAllTheWeirdStuff(arr1, arr2))
const addingAllTheWeirdStuff=(a,b)=>a.map(i=>(i>10?i+b.reduce((s,c)=>s+((c%2)?c:0),0):((i<10)?i+b.reduce((s,c)=>s+(!(c%2)?c:0),0):i))+b.some(e=>e>20));