首页 文章

仅添加奇数或偶数 .

提问于
浏览
-4

我想创建一个函数,当给定一个数字数组和一个条件(例如奇数或偶数)时,匹配该条件的数字被加在一起 . 如果没有值与条件匹配,则应返回0 .

如果没有Array.prototype.filter(),我怎么能这样做 - 我的教科书告诉我没有这种方法就可以做到这一点 .

如果我应该使用什么陈述?

console.log(conditionalSum([1, 2, 3, 4, 5], "even"));        => 6
console.log(conditionalSum([1, 2, 3, 4, 5], "odd"));         => 9
console.log(conditionalSum([13, 88, 12, 44, 99], "even"));   => 144
console.log(conditionalSum([], "odd"));                      => 0

谢谢 .

6 回答

  • 3

    您可以通过选择正确的回调来减少数组 .

    function conditionalSum(array, parts) {
        return array.reduce(
            parts === 'even' 
                ? (s, v) => s + (!(v % 2) && v)
                : (s, v) => s + (v % 2 && v),
            0
       );
    }
    
    console.log(conditionalSum([1, 2, 3, 4, 5], "even"));      //   6
    console.log(conditionalSum([1, 2, 3, 4, 5], "odd"));       //   9
    console.log(conditionalSum([13, 88, 12, 44, 99], "even")); // 144
    console.log(conditionalSum([], "odd"));                    //   0
    
  • -2
    function conditionalSum(arr, cond) {
      var total_length = arr.length;
      var total_num = 0;
      if (total_length === 0) {
        return 0;
      }
      if (cond === 'even') {
        for (i = 0; i < arr.length; i++) {
          if (arr[i] % 2 === 0) {
            total_num += arr[i];
          }
        }
      }
      if (cond == 'odd') {
        for (i = 0; i < arr.length; i++) {
          if (arr[i] % 2 != 0) {
            total_num += arr[i];
          }
        }
      }
    
      return total_num;
    }
    

    看一下这个

  • -2

    简单而整洁的解决方案

    function conditionalSum(nums, operation) {
      var condition = ['even', 'odd'];
      sum = 0;
      nums.forEach(function(i) {
        if (condition[i % 2] == operation) {
          sum += i;
        }
      });
      return sum;
    }
    
    console.log(conditionalSum([1, 2, 3, 4, 5], "even"));
    console.log(conditionalSum([1, 2, 3, 4, 5], "odd"));
    console.log(conditionalSum([13, 88, 12, 44, 99], "even"));
    console.log(conditionalSum([], "odd"));
    

    希望,这会有所帮助 .

  • 0

    我建议将条件函数作为参数传递 .

    这样,您可以为许多不同的操作重用相同的功能 .

    /**
     * conditionalSum
     * Runs a list of numbers against a custom conditional function and accumulators the values that passes
     * @param {number[]} list
     * @param {(n: number) => boolean} condition
     * @returns {number}
     */
    function conditionalSum(list, condition) {
        var total = 0;
        for (var index = 0; index < list.length; index++) {
            var value = list[index];
            if (condition(value)) {
                total += value;
            }
        }
        return total;
    }
    //TEST
    function isEven(n) { return n % 2 === 0; }
    function isOdd(n) { return n % 2 !== 0; }
    console.log(conditionalSum([1, 2, 3, 4, 5], isEven));
    console.log(conditionalSum([1, 2, 3, 4, 5], isOdd));
    console.log(conditionalSum([13, 88, 12, 44, 99], isEven));
    console.log(conditionalSum([], isOdd));
    
  • 0
    const conditionalSum = (numbers, operation) => {
          const value = operation === "even" ? 0 : 1;
          return numbers.filter(number => number % 2 === value).reduce((acc, num) => acc + num, 0);
        }
        
        console.log(conditionalSum([1, 2, 3, 4, 5], "even"));      //   6
        console.log(conditionalSum([1, 2, 3, 4, 5], "odd"));       //   9
        console.log(conditionalSum([13, 88, 12, 44, 99], "even")); // 144
        console.log(conditionalSum([], "odd"));                    //   0
    
  • 0

    实际上有几种方法可以解决这个问题 .

    第一个是使用 filter 获取预期数字列表,然后将它们与 reduce 相加 . 这是为了获得最佳可读性 .

    let conditionalSum = (arr, parity) => {
      return arr
          .filter(num => parity === 'even' ? num % 2 === 0 : num % 2 !== 0)
          .reduce((prev, curr) => prev + curr, 0);
    };
    console.log(conditionalSum([1, 2, 3, 4, 5], "even"));
    console.log(conditionalSum([1, 2, 3, 4, 5], "odd"));
    console.log(conditionalSum([13, 88, 12, 44, 99], "even"));
    console.log(conditionalSum([], "odd"));
    

    同时使用 for 循环有助于提供更高性能的解决方案 .

    let conditionalSum = (arr, parity) => {
      let sum = 0;
      for(let num of arr) {
        if(parity === 'even' && num % 2 !== 0
        || parity === 'odd' && num % 2 === 0) {
          continue;
        }
        sum += num;
      }
      return sum;
    };
    
    console.log(conditionalSum([1, 2, 3, 4, 5], "even"));
    console.log(conditionalSum([1, 2, 3, 4, 5], "odd"));
    console.log(conditionalSum([13, 88, 12, 44, 99], "even"));
    console.log(conditionalSum([], "odd"));
    

    因此,选择正确的解决方案取决于您的使用案例 . 我认为大多数时候你应该选择可读性 .

相关问题