【问题标题】:Given an array of integers, how do I find the sum of its elements with some simple constraints in JavaScript?给定一个整数数组,如何在 JavaScript 中通过一些简单的约束找到其元素的总和?
【发布时间】:2021-11-09 18:31:33
【问题描述】:

求数组元素的总和 我已经尝试过这种方法,但是输出未定义而不是整数

约束是array.length > 0 && array[i] <= 1000

function simpleArraySum(ar) {
    let acc = 0;
    for (let i = 0; ar.length; i++) {
        if (ar.length > 0 && ar[i] <= 1000) {
            acc += ar[i]
        } else {
            return
        }
    }
    return acc;
}

任何帮助将不胜感激。

【问题讨论】:

  • 应该怎么做呢?目前,您只是在约束不成立时退出函数。
  • 这就像删除 else 块一样简单,因为它是不必要的。
  • return arr.filter(val =&gt; val&lt;=1000).reduce((acc, val) =&gt; acc+=val);
  • 条件不满足怎么办?

标签: javascript arrays sum reduce


【解决方案1】:

首先检查参数是否传递给函数is an array 并在其中包含元素。如果不从函数中返回,则进行计算,然后返回值。

function simpleArraySum(ar) {
  if (!Array.isArray(ar) || !ar.length) return 'Not a valid array';
  let acc = 0;
  for (let i = 0; i < ar.length; i++) {
    if (ar[i] <= 1000) acc += ar[i];
  }
  return acc;
}

console.log(simpleArraySum([1, 2, 3]));
console.log(simpleArraySum([]));
console.log(simpleArraySum([10, 1, 2, 100, 1001]));
console.log(simpleArraySum('string'));
console.log(simpleArraySum([10, 1, 2, 100, 1000]));

【讨论】:

  • 注意一种情况...ar[i] &lt;= 1000 而不是ar.length &lt;= 1000
  • 这是漫长的一天@PeterSeliger。感谢您发现这一点。
【解决方案2】:

首先,您只需要检查一次数组的长度是否为正数,因为它将保持不变。

如果你的条件不满足,你可以直接返回 null:

function simpleArraySum(ar) {
    if(ar.length <= 0){
       return null;
    }
    let acc = 0;
    for(let i = 0; ar.length; i++){
       if(ar[i] <= 1000){
          acc += ar[i]
       }
       else{
          return null;
       }
    }
    return acc;
}

【讨论】:

  • 基于要相加的数字只是小于1000的所有数字的约束,在相加的数组中可能有负值。所以,else 不适合使用 -1。
  • PatrickEvans 已修复,@DhanaD。它说数组 [i]
  • 确实是这样,但是假设有这样的数组:[2, 3, -4, -1, -1],该数组的总和是-1,它与您在代码中给出的无效数组条件相同,不是是吗?但是,是的,您已经将它修复为适合这种情况的 null
  • @DhanaD。哦,对不起,我误解了你的评论。我已经在我的编辑中考虑了这一点。
  • 第一次验证打错了,你只是把第二个改成null
【解决方案3】:

function arraySum(arr){
  if(arr.length > 0){
    const sum = arr.reduce((a,i) => {
      if (i <= 1000){
        return a + i
      }
      else{
        return a
      }
    })
    return sum 
  }
}
arr = [2,4,3,5,3 , 1002, 34, 34 , 34,34 , -150]
console.log(arraySum(arr))

【讨论】:

    【解决方案4】:

    您可以使用reduce 动态添加数组元素。您所需要的只是一个累积值的函数(在下面的示例中为sumSmallNumbers)和一个起始值(在本例中为 0)。它很方便,但不是最容易理解的概念,但一旦学会就会不时成为救命稻草。

    const myArray = Array.from({length: 3}, () => Math.floor(Math.random() * 1500)); // creates an array of 3 elements with random numbers
    console.log(`Array elements: `, String(myArray));
    
    function simpleArrSum(arr) {
      if(!arr.length) { // this check is not needed if you're sure to receive an array
      
        return 0; 
      }
      const sum = arr.reduce(
        function sumSmallNumbers(accumulator, current) {
          return (current <= 1000 ? accumulator + current : accumulator); // Conditional (ternary) operator, also very usefull!
        },
        0
      );
      
      return sum;
     }
    
    console.log(`Sum of elements that are less then 1000: `, simpleArrSum(myArray));

    【讨论】:

    • 没有办法知道数组是否有效
    • 尽管我不是投反对票的人,但约束是x &lt;= 1000 而不是x &lt;1000
    • @iunfixit 从问题的角度来看 - 它是。如果它的长度== 0,它将返回0,这是可以理解的要求(“结果应该是整数”)。如果您说变量需要具有正确的类型 - 您可能应该确保在您的代码中使用正确的类型,并且不要将函数的读者与不必要的多态性混淆。但我已经扩展了我的代码以满足您的需要:)
    【解决方案5】:

    计算所有数字数组的总和是如何利用Array.prototype.reduce 的最受关注的示例之一。 OP 只需要在减少回调函数中包含正确的约束/条件 ...

    function aggregateConditionedTotal(total, int) {
      return total + ((int <= 1000) ? int : 0);
    }
    const arr = [];
    
    console.log(
      (arr.length > 0)
        ? arr.reduce(aggregateConditionedTotal, 0)
        : null
    );
    console.log(
      [1001].reduce(aggregateConditionedTotal, 0)
    );
    
    console.log(
      [1, 2, 3, 1001, 4].reduce(aggregateConditionedTotal, 0)
    );
    console.log(
      [1, 2, 3, 1000, 4].reduce(aggregateConditionedTotal, 0)
    );
    .as-console-wrapper { min-height: 100%!important; top: 0; }

    这是可能的 reducer 的另一种实现。从 Q 开始,一旦一个项目不符合标准,OP 是否想要完全使总数无效就变得不清楚了。下面的代码就是这样做的......

    function aggregateConditionedTotal(total, int) {
      return ((total !== null) && (int <= 1000))
        ? (total + int)
        : null;
    }
    const arr = [];
    
    console.log(
      (arr.length > 0)
        ? arr.reduce(aggregateConditionedTotal, 0)
        : null
    );
    
    console.log(
      [1, 2, 3, 1001, 4].reduce(aggregateConditionedTotal, 0)
    );
    console.log(
      [1, 2, 3, 1000, 4].reduce(aggregateConditionedTotal, 0)
    );
    
    console.log(
      [1000].reduce(aggregateConditionedTotal, 0)
    );
    console.log(
      [1001].reduce(aggregateConditionedTotal, 0)
    );
    .as-console-wrapper { min-height: 100%!important; top: 0; }

    【讨论】:

      【解决方案6】:

      如果您要查找输入数组中数字的总和,您只需将索引从 0 循环到 array.length。在for 循环内,您将作为

      let i = 0; ar.length; i++
      

      这里for循环的条件是ar.length,它总是真实的。您应该使条件更具体为i &lt; ar.length。所以这只会循环到 0 到 ar.length

      使用上述固定逻辑进行处理

      function simpleArraySum(ar) {
        let acc = 0;
        // Check the index is less than length of array
        for (let i = 0; i < ar.length; i++) {
          // Your special condition
          if (ar.length > 0 && ar[i] <= 1000) {
            acc += ar[i]
          }
        }
        return acc;
      }
      console.log(simpleArraySum([1, 2, 3]));

      为什么您的代码会抛出未定义的错误?

      在您的代码中,您正在运行 for 循环

      let i = 0; ar.length; i++
      

      这里提到的条件是ar.length,这总是正确的(假设数组的长度大于0)。所以这是一种无限循环,永无止境。通过将 return 语句放在 else 块中,您正在使这个无限循环成为有限循环。此返回不提供值,因此返回值未定义。此返回以未定义的值从函数中退出。这就是为什么您的代码返回未定义的原因。

      您的数组从索引 0 开始循环。在索引 0 之后,从 1 到数组的长度,之后 ar[i] 的值将未定义,并且该值 ar[i] &lt;= 1000 将为 false。这会将执行移至 else 块并返回 undefined。请在下面找到添加了控制台语句的小提琴。

      您的代码使用控制台语句执行。

      function simpleArraySum(ar) {
          let acc = 0;
          for (let i = 0; ar.length; i++) {
              if (ar.length > 0 && ar[i] <= 1000) {
                  acc += ar[i]
              } else {
                  // Exiting here
                  console.log('Im exiting here, I dont provide a retun value');
                  return;
              }
          }
          return acc;
      }
      console.log(simpleArraySum([1, 2, 3]));

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-16
        • 1970-01-01
        相关资源
        最近更新 更多