仅输出后一个字符串,其中包含 JavaScript 中最大数字的总和的数字

Outputting only the latter string with digits that sum the largest number in javascript

本文关键字:数字 JavaScript 包含 和的 输出 字符串 一个      更新时间:2023-09-26

我一直在努力编写一个函数,该函数仅返回后一个字符串,其中包含与最大数字相加的数字(在带有电话号码的数组中)。

我已经研究并发现了一些关于这个问题的好提示。但是,我仍然没有设法以正确的方式对其进行编码。

该函数的方式是,它返回所有排序的数字及其分数,这并没有错,尽管我只需要打印后一个字符串,其中包含对最大数字求和的数字。

这是我的代码块作为一个整体:

function LargestPhoneNumber (array) { 
    
var phoneNumbers = array.map(function (m) {
    return {
        number: m,
        score: m.match(/'d/g).reduce(function (p, c) {
            return +p + +c;
        })
    };
})
phoneNumbers.sort(function (a, b) {
    if (a.score < b.score) {
        return 1;
    }
    if (a.score > b.score) {
        return -1;
    }
    return 1;
});
console.log(phoneNumbers);
};
LargestPhoneNumber(['555-555-5555','111-111-1111','555-555-5456','222-121-2121']);

该函数输出:

[ { number: '555-555-5456', score: 50 },
  { number: '555-555-5555', score: 50 },
  { number: '222-121-2121', score: 16 },
  { number: '111-111-1111', score: 10 } ]

以这些输入为例,即使有两个同样大的数字串,预期的输出也应该只是后者:"555-555-5456"

我也尝试过循环,但没有成功。我想我错过了任何一点,我无法意识到它是什么。

您的函数正在显示所有这些,因为您要求它这样做。

console.log(sums[0]); //display only the first item in the array

你的问题实际上涉及两个不同的问题。

第一个相当容易解决,并且已经回答了:如果你只想打印最高总和,那么从降序排序结果中,你只需要打印第一项,而不是整个数组。

但微妙的是,你想要最高金额的后者,如果不止一个。
目前你没有努力确保这一点:由于 JS Array.prototype.sort() 函数不稳定,你无法知道 ex-aequo 的顺序。

要修复它,您不仅必须按总和排序,还必须按等级排序,如下所示:

function LargestPhoneNumber (array) { 
    
var i = 0,
    phoneNumbers = array.map(function (m) {
    return {
        number: m,
        rank: i++,
        score: m.match(/'d/g).reduce(function (p, c) {
            return +p + +c;
        })
    };
})
phoneNumbers.sort(function (a, b) {
    if (a.score < b.score) {
        return 1;
    }
    if (a.score > b.score) {
        return -1;
    }
    // here a.score == b.score, then sort by rank
    if (a.rank < b.rank) {
        return 1;
    }
    if (a.rank > b.rank) {
        return -1;
    }
    return 0;
});
console.log(phoneNumbers[0]);
};
LargestPhoneNumber(['555-555-5555','111-111-1111','555-555-5456','222-121-2121']);

无论如何,由于您只对最终结果感兴趣,因此还有另一种更简单的方法可以实现它:

function LargestPhoneNumber (numbers) { 
  var selected = '',
      score = 0,
      highestScore = 0;
      
  for (var number of numbers) {
    score = number.match(/'d/g).reduce(function (p, c) {
      return +p + +c;
    });
    
    if (score >= highestScore) {
      highestScore = score;
      selected = number;
    }
  }
  console.log(selected);
}
LargestPhoneNumber(['555-555-5555','111-111-1111','555-555-5456','222-121-2121']);