我知道这里存在类似的问题Javascript string conversion and array sort,但我的解决方案版本需要帮助。
任务: 数字的权重是其数字的总和。 例如99将具有“权重”18,100将具有“权重”1因此在列表100中将出现在99之前。给定具有正常顺序权重的字符串可以回馈由这些数字的“权重”排序的该字符串?
实施例: “56 65 74 100 99 68 86 180 90”按数字重量排序成为:“100 180 90 56 65 74 68 86 99” FFC成员 当两个数字具有相同的“权重”时,让我们将它们分类为字符串而不是数字:100表示180之前,因为它的“权重”(1)小于180(9)的180和90之前的权重由于具有相同的“重量”(9),因此它作为一个字符串出现。
问题: 我唯一缺少的部分是如何做最后一部分,例如180将在207和90之前,类似207在45之前,依此类推。
var arr = [56, 65, 74, 100, 99, 207, 45, 68, 86, 180, 90];
arr.sort(function(a, b) {
var A = ("" + a).split("").reduce(function(c, d) {
return Number(c) + Number(d);
});
var B = ("" + b).split("").reduce(function(e, f) {
return Number(e) + Number(f);
});
if (A > B) {
return A - B;
} else if (A == B) {
//I ASSUME I SHOULD WRITE SOMETHING HERE
}
});
console.log(arr);
答案 0 :(得分:3)
您可以添加排序条件,并将结果与String#localeCompare
进行比较。
function weight(v) {
return v.toString().split('').reduce(function (a, b) { return +a + +b; });
}
var array = [56, 65, 74, 100, 99, 207, 45, 68, 86, 180, 90];
array.sort(function (a, b) {
return weight(a) - weight(b) || a.toString().localeCompare(b);
});
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:1)
我认为你正在寻找像这样的东西
var arr = [56, 65, 74, 100, 99, 207, 45, 68, 86, 180, 90];
arr.sort(function(a, b) {
var A = ("" + a).split("").reduce(function(c, d) {
return Number(c) + Number(d);
});
var B = ("" + b).split("").reduce(function(e, f) {
return Number(e) + Number(f);
});
if (A > B) {
return A - B;
} else if (A == B) {
return a.toString() - b.toString();
}
});
console.log(arr);
希望这有帮助!
答案 2 :(得分:0)
您可以使用sumDigits
函数来获取权重,然后在排序调用中调用此函数并进行比较。
var arr = [56, 65, 74, 100, 99, 207, 45, 68, 86, 180, 90];
arr.sort(function(a, b) {
var A = sumDigits(a);
var B = sumDigits(b);
if (A > B) {
return 1;
} else {
return -1;
}
});
console.log(arr);
function sumDigits(number) {
var str = number.toString();
var sum = 0;
for (var i = 0; i < str.length; i++) {
sum += parseInt(str.charAt(i), 10);
}
return sum;
}