返回数组中最高的数字总和

时间:2017-08-02 03:21:57

标签: javascript arrays

是否有一种好的方法可以循环使用它来返回具有最高数字总和的数字?所以,“333”应该是记录的内容,而不是“9”。

var myArr = [ '111' , '222' , '333' ];
var result = myArr.map(function(text){
  return text.match(/\d/g).reduce(function(x, y){
    return +y + x;
  }, 0);
});

6 个答案:

答案 0 :(得分:2)

如果所需的输出只是源阵列中的一个数字,则您不需要.map()功能。您可以使用.reduce()来比较每个数字的数字总和,但返回原始数字:



const sumDigits = n => (String(n).match(/\d/g)||[]).reduce((x,y) => +x + +y, 0);
const numWithLargestSum = arr =>
  arr.reduce((a, c) => sumDigits(a||0) >= sumDigits(c) ? a : c, null);

const myArr = [ '111' , '222' , '333' ];

console.log(numWithLargestSum(myArr));                // 333
console.log(numWithLargestSum([]));                   // null
console.log(numWithLargestSum(['4916-2600-1804-0530', '4779-252888-3972', '4252-278893-7978', '4556-4242-9283-2260'])); // 4779-252888-3972
console.log(numWithLargestSum(['123', '111', '321', ''])); // 123




注意:

  • 如果多个数字具有相同的总和,则上述将返回第一个。如果您想要返回 last ,只需将>=比较更改为>
  • 如果数组为空,则返回null。我已将null作为.reduce()操作的初始值,但随后使用||0将其转换为0,但是对于空数组而言,这并不是#{1}} 39; t run。
  • 我已经使用了问题中的.match(/\d/g),因为在评论中您讨论的是4779-252888-3972等输入字符串,但如果某个项目没有数字.match()则返回{ {1}}所以我已使用null来防范,以便在||[]函数中调用.reduce()结果。比添加sumDigits()更容易。

答案 1 :(得分:0)

原谅这种邋,,但是这样的事情呢?

此方法使用在循环中进行比较的变量来查找最高总数,同时使用第二个变量来存储最高的字符串表示。



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

function add(string) {
  string = string.replace(/-/g, "").split('');
  var sum = 0;
  for (var i = 0; i < string.length; i++) {
    sum += parseInt(string[i], 10);
  }
  return sum;
}

for (var i = 0; i < myArr.length; i++) {
  if(add(myArr[i]) > highest_total) {
    highest_string = myArr[i];
    highest_total = add(myArr[i]);
  }
  // Also log matchers
  else if (add(myArr[i]) == highest_total) {
    console.log(myArr[i]);
  }
}

console.log(highest_string);
&#13;
&#13;
&#13;

希望这有帮助! :)

答案 2 :(得分:0)

&#13;
&#13;
var myArr = [ '111' , '222' , '333'];
var result = myArr.map(function(text){
  var num = text.replace(/[^\d]/g, '') || '0';
  
  return new Function("return " + num.split("").join("+"))();
});
var max = Math.max.apply(Math, result);
var index = result.indexOf(max);

console.log("highest------",myArr[index])
&#13;
&#13;
&#13;

答案 3 :(得分:0)

你可以试试这个,

 Array.prototype.max = function() {
      return Math.max.apply(null, this);
    };
    var myArr = [ '111' , '222' , '333' ];
    var result = myArr.map(function(text){
      return text.split('').reduce((a, b) => Number(a) + Number(b), 0);
    });
    console.log(result);
    console.log(Math.max.apply(null, result));

答案 4 :(得分:0)

&#13;
&#13;
var myArr = ['111', '222', '444', '333'];

var indexOfMaxValue = myArr.map(function(str){
  return str.split("").reduce((x,y) => +x + +y, 0);
}).reduce((max, x, i, arr) => x > arr[max] ? i : max, 0);

console.log("indexOfMaxValue: " , indexOfMaxValue, ", the original value was: ", myArr[indexOfMaxValue]);
&#13;
&#13;
&#13;

答案 5 :(得分:0)

let f = s => s.split('').reduce((a, b) => +b+a || a, 0);

document.write( ["1-2", "3-4"].reduce((a, b) => f(a) > f(b) ? a : b) );       // "3-4"