Javascript 如何对数字进行预排序而不破坏格式?
我正在编写一个自定义函数,该函数将返回一个数组:Javascript 如何对数字进行预排序而不破坏格式?,javascript,google-apps-script,google-sheets,google-apps,Javascript,Google Apps Script,Google Sheets,Google Apps,我正在编写一个自定义函数,该函数将返回一个数组: function tester(col){ var rows = [ // this gives me an error on sorting, so turn numbers to strings [4,2,3,"Tom"], [0,8,9,"Bill"], [5,7,1,"Bob"], [1,2,3,"Charlie"] ]; rows = [ // turning numbers to stri
function tester(col){
var rows = [ // this gives me an error on sorting, so turn numbers to strings
[4,2,3,"Tom"],
[0,8,9,"Bill"],
[5,7,1,"Bob"],
[1,2,3,"Charlie"]
];
rows = [ // turning numbers to strings screws up formatting
["4","2","3","Tom"],
["0","8","9","Bill"],
["5","7","1","Bob"],
["1","2","3","Charlie"]
];
rows.sort(function(a, b) {
return a[col].localeCompare(b[col]); // sort by column passed by user
});
return rows;
}
如上所述,如果我传入数字,我会得到一个错误:
TypeError: Cannot find function localCompare in object
如果我将这些数字转换为字符串,我可以排序,但用户无法格式化这些数字…显示更多的小数、逗号、将它们转换为百分比等。我如何解决这个问题
编辑:
我试过Buzinas/Kriggs的建议,但它似乎对数字和负数进行了词汇排序,而其他的排序不正确。我现在有(注意负4和750):
更新 如果它们是数字,则要按数字排序,如果它们是字符串,则要按字符串排序,因此可以执行以下操作:
function tester(col){
var rows = [
[4,2,3,"Tom"],
[0,8,9,"Bill"],
[5,7,1,"Bob"],
[1,2,3,"Charlie"]
];
rows.sort(function(a, b) {
if (typeof a[col] === 'number')
return a[col] > b[col];
return a[col].localeCompare(b[col]);
});
return rows;
}
排序后把它们变回数字?一些讨厌的提示:
(0+“”)==“0”//true
@Roomy我不知道follow@kristen我的意思是将一个空字符串('
)添加到一个数字或数字的实例将产生一个字符串,因此遵循这个(a[col]+'')。localeCompare((b[col]+'')应该是您想要的。我没有测试它,这只是一个如何将任何数字转换为字符串的技巧。好吧,这真的很奇怪。现在,唯一可以正确排序的列是列0(第一列)。@kristen他将.toString()
放错了位置,这实际上是将整行转换为字符串,然后进行比较,这就是为什么看起来只有列a在索引,它应该是:a[col].toString().localeCompare(b[col].toString())代码>。如果你对hack'ish没有问题,你可以用(a[col]+'')来缩短它。localeCompare((b[col]+'')
。就是这样。非常感谢;)
function tester(col){
var rows = [
[4,2,3,"Tom"],
[0,8,9,"Bill"],
[5,7,1,"Bob"],
[1,2,3,"Charlie"]
];
rows.sort(function(a, b) {
if (typeof a[col] === 'number')
return a[col] > b[col];
return a[col].localeCompare(b[col]);
});
return rows;
}