【问题标题】:Sorting fails in multidimensional array多维数组排序失败
【发布时间】:2012-07-22 03:03:19
【问题描述】:

我在这方面花了很长时间,但无法发现这里的错误。

基本上,我有一个var test_arr = [['79',0],['8',1],['30', 2],['580',3],['59',4]] 类型的多元数组,它是从一个函数生成的。它的行为不像普通数组,因为我的 sort fxn var sort_arrays = function(a,b) {return 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

另外,input_kde[0] 是一个数组,input_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]]

【问题讨论】:

  • 其他需要确认的事情:(1)那个input_kde[0]是一个数组。 (2) 实际上正在调用 sort_arrays。 (为了调试,您可以临时添加类似if(! window.foo) { console.log("Called sort_arrays"); } window.foo = true; 的内容,以便在第一次调用时记录。) (3) input_kde[0][0] 是一个字符串。
  • @ruakh (2) sort_arrays 正在被调用,因为 .toString 都不会给出正确答案,我在 arr_test 案例中使用了 sort_arrays。
  • 嗯...将结果分配给一个值似乎可以使它起作用。否则返回一个未排序的数组。

标签: javascript multidimensional-array sorting


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    它似乎工作正常http://jsfiddle.net/w8T32/

    var test_arr = [['79',0],['8',1],['30', 2],['580',3],['59',4]];
    test_arr.sort(function(a,b){
        return a[0] -b[0];
    });
    console.log(test_arr)​
    

    输出类似于

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

    要考虑的一件事是 sort 没有记录的返回值(它会修改数组),但您似乎正在使用它。更改您的代码,使其不依赖于返回值,看看是否有任何不同

    【讨论】:

    • @Ryanmt 你的评论是什么意思?您同意并打算改进您的问题吗?如果这不是一个惊喜,你为什么要使用它?你只是在浪费人们试图在这里帮助你的时间,没有在你的问题上付出足够的努力
    • 我的测试用例数组确实有效。我已经在上面展示了,我遇到的问题是实际数据,如 input_kde。
    • sort 的替代品有没有就地修改?
    • @Ryanmt 不,没有,但是拆分代码应该很容易,因此它不使用返回值。示例 var arr = []; console.log(arr.sort()); 变为 var arr = []; arr.sort(); console.log(arr); 另外,您的第二个示例在我尝试时也有效
    【解决方案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]] //测试运行 var sorted=input_kde.sort(function(a,b){return a[0]-b[0]}); 警报(排序);

    我找不到任何问题!!!!

    实际上,为什么您的代码在第二次运行中未能返回正确的值是因为您已经将变量sort_arrays 设置为之前的变量!因此,失败了!

    【讨论】:

    • 显然我永远不会理解 Javascript。我在哪里为 sort_arrays 分配了一些东西?
    • 如果你想让它工作,修改你的代码 - function sort_arrays(a,b){return a[0]-b[0]} ;现在 evrything 应该可以正常工作,例如:- var sorted=input_kde.sort(sort_arrays);alert(sorted); var sorted2=test_arr.sort(sort_arrays);alert(sorted2);
    • 为什么你的第一个代码无法工作是 sort_arrays=function(a,b){return a[0]-b[0]} 当你第一次运行时已经有一些值数组,也就是 test_arr 和以前的不一样了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    相关资源
    最近更新 更多