【问题标题】:Javascript summing numbers from strings nested in arrayJavascript从嵌套在数组中的字符串中求和数字
【发布时间】:2016-12-05 20:55:49
【问题描述】:

我的任务是创建一个具有单个输入参数的函数。此参数是一个数组,其中包含带有连字符的信用卡号字符串。 该函数必须输出数字和最大的信用卡号。如果两个信用卡号的总和相同,则应返回最后一个信用卡号。 这是嵌套数组的示例。

['4916-2600-1804-0530', '4779-252888-3972', '4252-278893-7978', '4556-4242-9283-2260']

以下是我尝试过的。任何和所有的建议表示赞赏。谢谢!

function creditSum(creditCardNumber) {
      var number1= creditCardNumber[0];
      var number2= creditCardNumber[1];
      var number3= creditCardNumber[2];
      var number4= creditCardNumber[3];
      var split1=[];
      var split2=[];
      var split3=[];
      var split4=[];
       split1= number1.split ('');
       split2= number2.split ('');
       split3= number3.split ('');
       split4= number4.split ('');
      var sum1= split1[0]+split1[1]+split1[2]+split1[3]+split1[5]+split1[6]+split1[7]+split1[8]+split1[10]+split1[11]+split1[12]+split1[13]+split1[15]+split1[16]+split1[17]+split1[18];
      var sum2= split2[0]+split2[1]+split2[2]+split2[3]+split2[5]+split2[6]+split2[7]+split2[8]+split2[10]+split2[11]+split2[12]+split2[13]+split2[15]+split2[16]+split2[17]+split2[18];
      var sum3= split3[0]+split3[1]+split3[2]+split3[3]+split3[5]+split3[6]+split3[7]+split3[8]+split3[10]+split3[11]+split3[12]+split3[13]+split3[15]+split3[16]+split3[17]+split3[18];
      var sum4= split4[0]+split4[1]+split4[2]+split4[3]+split4[5]+split4[6]+split4[7]+split4[8]+split4[10]+split4[11]+split4[12]+split4[13]+split4[15]+split4[16]+split4[17]+split4[18];
      if (sum1>sum2 && sum1>sum3 && sum1>sum4){
        answer= number1;
      }
      else if (sum2>sum1 && sum2>sum3 && sum2>sum4){
        answer= number2;
      }
      else if (sum3>sum1 && sum3>sum2 && sum3>sum4){
        answer=number3;
      }
      else if (sum4>sum1 && sum4>sum2 && sum4>sum3){
        answer=number4;
      }
      else if (sum1==sum2){
        answer=number2;
      }
        else if (sum1==sum3){
          answer=sum3;
        }
        else if (sum1==sum4){
          answer=sum4;
        }
        else if (sum2==sum3){
          answer=sum3;
        }
        else if (sum2==sum4){
          answer=sum4;
        }
        else if (sum3==sum4){
          answer=sum4;
        }
        return answer

    }

【问题讨论】:

标签: javascript arrays nested sum


【解决方案1】:

你可以使用这个 ES6 函数:

function cardWithMaxSum(creditCardNumbers) {
    return creditCardNumbers.reduce( (best, card) => {
        let sum = card.match(/\d/g).reduce( (a,b) => +a + +b );
        return sum >= best[0] ? [sum, card] : best;
    }, [-1] )[1];
}

var creditCardNumbers = ['4916-2600-1804-0530', '4779-252888-3972', 
                         '4252-278893-7978', '4556-4242-9283-2260'];

console.log(cardWithMaxSum(creditCardNumbers));

【讨论】:

  • 爱它! :) 太棒了!
  • 这是一个比我尝试的更优雅的解决方案。谢谢你。我对我现在需要学习的领域有了一个很好的了解。再次感谢您的出色示例和您的时间。
【解决方案2】:

这个问题听起来很像家庭作业。无论哪种方式,请不要只是复制和粘贴此代码。阅读 cmets,花点时间了解它在做什么,或许还可以研究一下 Array.prototype.sort

//Some sample data
var numbers = [
  "2345-6789-0123-4567",
  "3456-7890-1234-5678",
  "4567-8901-2345-6789",
  "1234-5678-9012-3456"
];

function getLargestCreditNumber(numbers){
  /*
  Custom sort function to sort the array (smallest to largest).
  Sort function runs in iterations and compares two items from the array
  at a time. We need to return 1 if a > b, -1 if a < b, or 0 if they are
  equal.
  */
  numbers.sort(function(a, b){
    //Split number 'a' by hyphens
    var parts1 = a.split('-');
    //Sum the parts
    var sum1 = parts1.reduce(function(a, b){
       return parseInt(a) + parseInt(b);
    }, 0);
    //Split number 'b' by hyphens
    var parts2 = b.split('-');
    //Sum the parts
    var sum2 = parts2.reduce(function(a, b){
       return parseInt(a) + parseInt(b);
    }, 0);
    //Return number to indicate how these two items compare
    return sum1 > sum2 ? 1 : sum1 < sum2 ? -1 : 0;
  });
  //Return the last item in the array
  return numbers.pop();
}
console.log(getLargestCreditNumber(numbers));

【讨论】:

    【解决方案3】:

    您可以使用reduceMath.max 来大大简化您的代码。像这样的:

    const input = ['4916-2600-1804-0530', '4779-252888-3972', '4252-278893-7978', '4556-4242-9283-2260'];
    
    function sumDigits(str) {
    	return Array.from(str).reduce((result, value) => {
    		const num = parseInt(value) || 0;
    		return result + num;
    	}, 0);
    }
    
    function findMax(inputArr) {
    	return inputArr.reduce(
    		(prev, input) => Math.max(prev, sumDigits(input)),
    		0
    	);
    }
    
    console.log(findMax(input));

    【讨论】:

      【解决方案4】:

      您是否在寻找最大位数的卡号索引?

      试试这个:(ES6)

      numbers=['4916-2600-1804-0530', '4779-252888-3972', '4252-278893-7978', '4556-4242-9283-2260']
      
      
      console.log(
              numbers.map(
                      e=>{
                          var value = parseInt(e.replace(new RegExp('-', 'g'),"")),sum = 0;
                          console.log(value);
                          while (value) {
                              sum += value % 10;
                              value = Math.floor(value / 10)
                          }
                          console.log(sum);
                          return sum;
                      }
              ).reduce((max, x, i, arr) => x > arr[max] ? i : max, 0)
      );
      

      【讨论】:

        【解决方案5】:

        可能与这里的许多其他精彩答案相似

        var creditCardsArr = ['4916-2600-1804-0530', 
                              '4779-252888-3972', 
                              '4252-278893-7978', 
                              '4556-4242-9283-2260'];
        
        // Strip off dashes and convert from string to sum of digits of each card
        var creditCardSumOfDigitsArr = creditCardsArr.map(function(cc){
          cc = cc.replace(/-/g, "");
          return cc.split("").reduce(function(a, b){ return a + parseInt(b)}, 0);
        });
        
        var indexOfMaxCreditCard =   creditCardSumOfDigitsArr.reduce(function(maxIndexSoFar, cur, curIndex, arr){
          return cur >= arr[maxIndexSoFar] ? curIndex : maxIndexSoFar;
        }, 0);
        
        console.log("Credit card with highest sum of digits: " +   creditCardsArr[indexOfMaxCreditCard]);
        

        【讨论】:

        • 感谢您的信息。 .map 和 .replace 是有用的工具,我会放在我的后兜里。我也需要学习 parseInt 。我不太明白。
        【解决方案6】:

        您可以将数字与总和的值映射,然后选择最后一个最大的对象并只取数字。

        function getMax(array) {
            return array.map(function (a) {
                return { n: a, v: a.match(/\d/g).reduce(function (a, b) { return +a + +b; }) };
            }).reduce(function (r, a, i) {
                return i && r.v > a.v ? r : a;
            }, 0).n;
        }
        
        console.log(getMax(['4916-2600-1804-0530', '4779-252888-3972', '4252-278893-7978', '4556-4242-9283-2260']));

        【讨论】:

          【解决方案7】:

          看,希望这段代码对你有帮助,一定要测试一下。

          function getMaxSerialNumb(sNumbers) {
          	/*Function that gets the maximun sum of the
          	serial number in a list of serials numbers*/
              var n, i, sums;
              i = 0;
              sums = [];
              while (i < sNumbers.length) {
                  sums.push(serialSum(sNumbers[i]));
                  i++;
              }
              n = sums.lastIndexOf(Math.max.apply(null, sums));
              return sNumbers[n];
          }
          
          function serialSum(sNumber) {
          	/*Function that gets the sum of a single 
          	serial number.*/
              var i, integers, answer;
              integers = sNumber.split(/[-]+/g);
              i = 0;
              answer = 0;
              while (i < integers.length) {
                  answer += Number(integers[i]);
                  i++;
              }
              return answer;
          }
          /*Example*/
          numbers=['4916-2600-1804-0530', '4779-252888-3972', '4252-278893-7978', '4556-4242-9283-2260']
          console.log(getMaxSerialNumb(numbers))

          【讨论】:

            【解决方案8】:

            我想做以下工作;

            var arr = ['4916-2600-1804-0530', '4779-252888-3972', '4252-278893-7978', '4556-4242-9283-2260'],
                res = arr.map((c,i,a) => [c.match(/\d/g)
                                           .reduce((p,c) => +p + +c), c])
                         .reduce((p,c) => c[0] >= p[0] ? c
                                                       : p, [0])[1];
            console.log(res);

            【讨论】:

              猜你喜欢
              • 2018-06-25
              • 1970-01-01
              • 1970-01-01
              • 2021-08-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-03-08
              相关资源
              最近更新 更多