将数字排序为字符串的条件

问题描述:

我知道这里存在类似的问题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);

您可以添加一个排序条件,并将结果与​​进行比较。

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; }

+0

非常感谢你......我尝试了一切,但我甚至都不知道localcompare)) – Alex

我认为你正在寻找这样的事情

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); 

希望这有助于!

+0

所以,我只是他们转换为字符串,并取得了比较,但在评论部分由@ 4castle给出的答案是好多了,我就完成了你的代码 – zenwraight

+0

谢谢。我曾试图这个版本并没有工作。我现在正在尝试4castle-s的建议 – Alex

+0

要通过字符串进行比较,您需要使用localeCompare而不是减法,它通过数字值进行比较。 – 4castle

你可以使用一个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; 
 
}