如何按列值对二维数组进行排序?

IT技术 javascript arrays sorting multidimensional-array
2021-01-27 12:20:56

有人可以帮我在 JavaScript 中对二维数组进行排序吗?

它将具有以下格式的数据:

[12, AAA]
[58, BBB]
[28, CCC]
[18, DDD]

排序后应该是这样的:

[12, AAA]
[18, DDD]
[28, CCC]
[58, BBB]

所以基本上,按第一列排序。

干杯

6个回答

就这么简单:

var a = [[12, 'AAA'], [58, 'BBB'], [28, 'CCC'],[18, 'DDD']];

a.sort(sortFunction);

function sortFunction(a, b) {
    if (a[0] === b[0]) {
        return 0;
    }
    else {
        return (a[0] < b[0]) ? -1 : 1;
    }
}

我邀请您阅读文档

如果要按第二列排序,可以这样做:

a.sort(compareSecondColumn);

function compareSecondColumn(a, b) {
    if (a[1] === b[1]) {
        return 0;
    }
    else {
        return (a[1] < b[1]) ? -1 : 1;
    }
}
... 正如您将在文档中看到的,array.sort()方法将一个函数作为参数,这在 JavaScript 中很常见。中的Array.sort()方法的设计,它知道如何处理传递给它的功能做的方式:它使用它来比较它的元素。这是我制作的一个非常蹩脚的小提琴,试图演示如何将函数作为引用传递......抱歉,它太糟糕了。
2021-03-11 12:20:56
请实际测试您的代码。jsfiddle.net/DuR4B/2直接来自您发布的文档链接:“如果未提供 compareFunction,则通过将元素转换为字符串并按字典顺序(“字典”或“电话簿”,而不是数字)比较字符串来对元素进行排序。例如,“80”来了按字典顺序在“9”之前,但在数字排序中,9 在 80 之前。”
2021-03-12 12:20:56
@Ian - 你说得对。好点子。我想我太兴奋了,要证明一个关于简单的观点。我确实测试过,但不完全。现在我会修复它...我希望在我把那个鸡蛋涂满我的脸之前样本数据已经证明了你的观点!
2021-03-13 12:20:56
哈哈我知道我知道,我讨厌这种事情发生。它看起来很正确,但内部发生了一些变化,但没有按预期进行。有点像将字符串与<or进行比较>无论如何,我喜欢更新:)
2021-03-26 12:20:56
@Ash - 最好看的地方是文档。我喜欢 Mozilla 的文档,所以当我对 JS 函数有疑问时,我总是谷歌“mdn {{function_name}}”。在这种情况下,搜索词将是“mdn array.sort”,它会将您带到这里
2021-03-31 12:20:56

最好的方法是使用以下内容,因为第一列中可能有重复的值。

var arr = [[12, 'AAA'], [12, 'BBB'], [12, 'CCC'],[28, 'DDD'], [18, 'CCC'],[12, 'DDD'],[18, 'CCC'],[28, 'DDD'],[28, 'DDD'],[58, 'BBB'],[68, 'BBB'],[78, 'BBB']];

arr.sort(function(a,b) {
    return a[0]-b[0]
});
这是正确的答案,它考虑了数字中的两个数字。谢谢!
2021-03-28 12:20:56

试试这个

//WITH FIRST COLUMN
arr = arr.sort(function(a,b) {
    return a[0] - b[0];
});


//WITH SECOND COLUMN
arr = arr.sort(function(a,b) {
    return a[1] - b[1];
});

注意:原始答案使用了大于 (>) 而不是减号 (-),这就是评论所指的不正确。

没有为我工作。@jahroy 是回答正确的人
2021-03-24 12:20:56
给那些阅读评论的人一个注释:1 月 5 日更正了答案。现在是正确的(比较函数返回三种可能的状态)。
2021-03-27 12:20:56
@Bergi,感谢您指出这一点。(对我来说,它在 IE11 中无法正常工作)并且在我看到您的评论之前我无法理解(为什么它在 chrome 中工作)。谢谢!
2021-03-29 12:20:56
8 赞成一个明显错误的解决方案?我无法相信这。请阅读比较函数并了解它们何时需要返回负值。
2021-04-01 12:20:56
正如贝尔吉所说,这不是正确的解决方案。虽然它可能在许多情况下工作,但有时它不会按预期工作,你会挠头(这发生在我身上)。问题的关键在于,这个方案中的比较函数只返回两个状态(真/1、假/0),但它应该返回三个状态(零、大于零和小于零)。
2021-04-09 12:20:56

使用箭头函数,并按第二个字符串字段排序

var a = [[12, 'CCC'], [58, 'AAA'], [57, 'DDD'], [28, 'CCC'],[18, 'BBB']];
a.sort((a, b) => a[1].localeCompare(b[1]));
console.log(a)

如果你和我一样,你不会想在每次想要更改排序所依据的列时都更改每个索引。

function sortByColumn(a, colIndex){

    a.sort(sortFunction);

    function sortFunction(a, b) {
        if (a[colIndex] === b[colIndex]) {
            return 0;
        }
        else {
            return (a[colIndex] < b[colIndex]) ? -1 : 1;
        }
    }

    return a;
}

var sorted_a = sortByColumn(a, 2);
我刚刚看到你的答案,在我自己用完全相同的推理起草了一个答案之后 - 有一点不同 - 我实际上返回了函数来直接排序。
2021-03-29 12:20:56