Javascript 多维数组中的排序失败

Javascript 多维数组中的排序失败,javascript,multidimensional-array,sorting,Javascript,Multidimensional Array,Sorting,我花了相当长的时间在这个问题上,并没有能够发现这里的错误 本质上,我有一个多元数组,类型为var test\u arr=[[79',0],[8',1],[30',2],[580',3],[59',4],我从一个函数生成它。它的行为与普通数组不同,因为我的sort fxnvar sort_arrays=function(a,b){返回a[0]-b[0]}无法正确排序数组值 我试图确保我有一个实际的数组,并且我没有调用其他排序方法 因此: console.log(arr_test.sort(sort

我花了相当长的时间在这个问题上,并没有能够发现这里的错误

本质上,我有一个多元数组,类型为
var test\u arr=[[79',0],[8',1],[30',2],[580',3],[59',4]
,我从一个函数生成它。它的行为与普通数组不同,因为我的sort fxn
var sort_arrays=function(a,b){返回a[0]-b[0]}无法正确排序数组值

我试图确保我有一个实际的数组,并且我没有调用其他排序方法

因此:

console.log(arr_test.sort(sort_arrays)); 
给出:
[[8,1],[30,2],[59,4],[79,0],[580,3]

然而,在我的fxn上打电话

console.log(input_kde.sort(sort_arrays));
,给出:
[…,[580,0.002],[59,0.001]]

在试图生成一些可打印的输出时,我对结果调用了
.toString
,得到了正确排序的输出,这只会加深我的困惑

我尝试使用
parseFloat(a[0])
进行显式类型转换,但没有成功

我还尝试确认这确实是一个数组:

console.log(typeof(input_kde)); //#> object
console.log(input_kde.constructor); //#> function Array() { [native code] }
console.log(input_kde instanceof Array); //#> true
此外,输入_kde[0]是一个数组,输入_kde[0][0]是一个数字

console.log(input_kde[0] instanceof Array); //#> true
console.log(typeof(input_kde[0][0])); //#> number
我错过了什么

edit2

var input_kde = [[22,0.0017095221275204712],[24,0.001712291003699343],[28,0.001716821328044571],[307,0.0009792081392809542],[33,0.0017205981968323918],[34,0.0017211029300063302],[341,0.0010085669284820244],[35,0.0017215244128879188],[387,0.0010558490092862406],[4,0.0016696065108796395],[40,0.0017223891946762664],[448,0.0010667514507313397],[491,0.0010124434821844265],[519,0.0009480280002363708],[580,0.0007465298453339767],[59,0.0017073128314605394]]

我可能只是在黑暗中拍摄这里,但你有混合类型在那里(字符串和int)?

我可能只是在黑暗中拍摄这里,但你有混合类型在那里(字符串和int)?

似乎工作正常

输出是这样的

[['8',1], ['30',2], ['59', 4], ['79',0], ['580', 3]]

要考虑的是,排序没有记录的返回值(它就地修改了数组),但您似乎在使用它。更改代码,使其不依赖于返回值,然后查看这是否会产生任何差异,它似乎工作正常

var input_kde = [[22,0.0017095221275204712],[24,0.001712291003699343],[28,0.001716821328044571],[307,0.0009792081392809542],[33,0.0017205981968323918],[34,0.0017211029300063302],[341,0.0010085669284820244],[35,0.0017215244128879188],[387,0.0010558490092862406],[4,0.0016696065108796395],[40,0.0017223891946762664],[448,0.0010667514507313397],[491,0.0010124434821844265],[519,0.0009480280002363708],[580,0.0007465298453339767],[59,0.0017073128314605394]] //test run var sorted=input_kde.sort(function(a,b){return a[0]-b[0]}); alert(sorted); 输出是这样的

[['8',1], ['30',2], ['59', 4], ['79',0], ['580', 3]]

要考虑的是,排序没有记录的返回值(它就地修改了数组),但您似乎在使用它。更改您的代码,使其不依赖于返回值,并查看这是否有任何区别

var input_kde = [[22,0.0017095221275204712],[24,0.001712291003699343],[28,0.001716821328044571],[307,0.0009792081392809542],[33,0.0017205981968323918],[34,0.0017211029300063302],[341,0.0010085669284820244],[35,0.0017215244128879188],[387,0.0010558490092862406],[4,0.0016696065108796395],[40,0.0017223891946762664],[448,0.0010667514507313397],[491,0.0010124434821844265],[519,0.0009480280002363708],[580,0.0007465298453339767],[59,0.0017073128314605394]] //test run var sorted=input_kde.sort(function(a,b){return a[0]-b[0]}); alert(sorted); var输入_kde=[[22,0.0017095221275204712],[24,0.00171229103699343],[28,0.001716821328044571],[307,0.0009792081392809542],[33,0.0017205981968323918],[34,0.001721102930006302],[341,0.0010085669284820244],[35,0.0017215215244128879188],[387,0.0010558490092862406],[4,0.001666510863908],[341,0.00167676767948],[491,0.0010124434821844265],[519,0.0009480280002363708],[580,0.0007465298453339767],[59,0.0017073128314605394]] //试运行 var sorted=input_kde.sort(函数(a,b){返回a[0]-b[0]}); 警报(已排序); 我没有发现任何错误

实际上,您的代码在第二次运行时未能返回正确的值是因为您已将变量
sort\u array
设置为上一个变量!!因此,失败了

var输入_kde=[[22,0.0017095221275204712],[24,0.00171229103699343],[28,0.001716821328044571],[307,0.0009792081392809542],[33,0.0017205981968323918],[34,0.001721102930006302],[341,0.0010085669284820244],[35,0.0017215215244128879188],[387,0.0010558490092862406],[4,0.001666510863908],[341,0.00167676767948],[491,0.0010124434821844265],[519,0.0009480280002363708],[580,0.0007465298453339767],[59,0.0017073128314605394]] //试运行 var sorted=input_kde.sort(函数(a,b){返回a[0]-b[0]}); 警报(已排序); 我没有发现任何错误


实际上,您的代码在第二次运行时未能返回正确值的原因是,您已将变量
sort\u arrays
设置为上一个变量!!因此,失败了!

需要确认的其他事项:(1)输入kde[0]
是一个数组。(2)实际上正在调用
sort\u arrays
。(为了进行调试,您可以临时添加类似
if(!window.foo){console.log(“调用的排序数组”)}window.foo=true;
的内容,以便它只在第一次调用时记录。)(3)
input_kde[0][0]
是一个字符串。@ruakh(2)
sort_数组
正在被调用,两者都被调用。toString不会给出正确的答案,我在arr_测试用例中使用sort_数组。好吧……将结果赋给一个值似乎可以让它工作。否则它将返回一个未排序的数组。需要确认的其他事项有:(1)
input_kde[0]
是一个数组。(2)实际上正在调用
sort_array
。(为了进行调试,如果(!window.foo){console.log(“调用的sort_array”);}window.foo=true;,则可以临时添加类似
的内容;
input_kde[0][0]
是一个字符串。@ruakh(2)
sort\u array
正在被调用,两者都被调用。toString不会给出正确的答案,我在arr\u测试用例中使用sort\u array。好吧……将结果赋给一个值似乎可以让它工作。否则它会返回一个未排序的数组。@Ryanmt你的评论是什么意思?你同意并打算改进你的问题吗?如果它不是一个惊喜的话伊瑟,你为什么要用它?你只是在浪费人们试图帮助你的时间,没有在你的问题上投入足够的精力。我的测试用例数组确实有效。我在上面已经证明了,我的问题是与实际数据有关,就像在输入数据中一样。除了
排序
之外,有没有其他不适当修改的方法?@Ryanmt不,没有,但拆分代码应该很容易,这样就不会使用返回值。例如
var arr=[];console.log(arr.sort());
变成
var arr=[];arr.sort();console.log(arr)
另外,您的第二个示例在我尝试时也可以使用it@Ryanmt你的评论是什么意思?你同意并打算改进你的问题?如果这不是一个惊喜,你为什么要使用它?你只是在浪费人们的时间试图帮助你,没有在你的问题上投入足够的精力。我的测试用例数组确实有效。我已经展示了在上面,我遇到的问题是与实际数据有关,如在输入数据中。除了排序之外,是否有一种在