【问题标题】:Having trouble in JavaScript with Loops and Multiple Conditions在 JavaScript 中遇到循环和多个条件的问题
【发布时间】:2021-12-03 18:36:59
【问题描述】:

问题来了:

“编写一个函数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;
}

关于如何使问题的最后一部分起作用的任何建议?

提前致谢。

【问题讨论】:

  • 您的代码有不平衡的大括号。这是要解决的第一件事......其次,在循环中return 是一个坏主意,因为这样就不会有任何其他循环的迭代。第三,为什么要嵌套循环?如果您是第一部分代码的作者,我不明白您是如何编写第二部分的,因为您应该使用相同的编码模式。
  • 好的,我会检查大括号。我使用 return 是因为我不知道如何制作它,所以如果数组中只有一个项目超过 20,它只会向它添加 1 一次。这就是为什么我在找到第一个超过 20 的元素后使用 return 来返回数组。如果发现 array2 中的元素超过 20,则嵌套循环应该为数组中的每个元素加 1。
  • 是的,但是嵌套循环没有循环。您在第一次迭代时退出它。从您的问题来看,尚不清楚 &gt;20 检查是否应该在原始值上,还是在值被第一阶段修改后的值上。
  • 奖金对我来说有点不清楚。 “如果 array2 中的任何元素大于 20,则将 array1 中的每个元素加 1。” 这是否意味着对于 array2 中的 每个 元素>20 做 +1 或者如果有array2 > 20 中的一个或多个 元素是否只执行一次+1?

标签: javascript loops for-loop multiple-conditions


【解决方案1】:

正如有人指出的那样,在您的代码中,您的内部循环中有一个 return 语句,该语句正在跳出循环。

我还在这里添加了一个替代解决方案,只是为了多样化。首先使用 filter 和 reduce 计算奇数和偶数和。我还检查是否有任何元素超过 20。根据 arr2.some 的真/假值,我映射 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))

【讨论】:

    【解决方案2】:
    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));
    

    【讨论】:

    • 我喜欢它(假设它有效)!但我不认为这对他有用:)
    • 我不喜欢只是代码的答案。
    • 不,也是错误答案
    【解决方案3】:

    您在错误的地方使用了return,导致函数在第一个number&gt;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 
        
    }
    

    【讨论】:

    • 答案开头的文字没有解释或澄清任何内容。这是一个纯代码的答案。
    • @trincot 更新了我的答案
    • 对,所以现在它是一个纯代码的答案。那是没有用的。一个好的答案将解释提问者的代码中存在哪些问题,以及您的代码如何解决这些问题。
    • 看不到代码里面的注释吗?
    • 没错,我希望现在很清楚
    【解决方案4】:

    首先我删除了一些不必要的大括号并平衡它们以使其更具可读性(至少对我而言)

    然后我删除了您的最后一个嵌套循环,因为它不必要且效率低下。当您循环通过array2 以获取sumOddsumEven 时,您可以同时检查是否有任何元素是&gt;20 并将其存储在变量中(greaterThan20)。然后在添加总和时,您可以检查相同的 var 以添加 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;
    }
    

    【讨论】:

    • 我喜欢您使用变量来跟踪大于 20 的方式。它向我展示了如何在编码中更加灵活!
    【解决方案5】:

    你快到了。可以测试奇数或偶数,也可以测试&gt;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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-23
      • 2016-04-08
      • 2022-01-24
      • 2023-01-01
      • 1970-01-01
      • 2013-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多