javascript - 在 Javascript 中排序列表

标签 javascript sorting lodash

我有一个列表,其成员是嵌套的整数列表,例如:

[ [1,2], [], [1,2,3], [ [1,2],3], [1,2,4], [ [], [1,2] ], [34,5,6], [-1,66] ]

我想对这个列表进行排序,使用(世界上所有其他语言)会考虑嵌套列表的标准排序。例如:

[] < [ [1] ] < [ [1,2] ] < [ [2] ] < [ [11] ]

l.sort() 搞砸了,因为它将列表变成了字符串

有没有一种简单的方法,可以在 javascript(或像 lodash 这样的公共(public)库)中获得适当类型的嵌套列表?

最佳答案

这是一个由两个相互递归函数组成的系统,第一个将数组与非数组进行比较,将数字与数字进行比较,第二个将数组逐元素进行比较。

function cmp(x, y) {
    let ax = Array.isArray(x),
        ay = Array.isArray(y);
    return ax - ay || (ax ? cmpArr(x, y) : x - y);
}

function cmpArr(x, y) {
    let xlen = x.length,
        ylen = y.length,
        min = xlen < ylen ? xlen : ylen,
        c;

    for (let i = 0; i < min; i++) {
        if (c = cmp(x[i], y[i]))
            return c;
    }

    return xlen - ylen;
}

//

a = [[1, 2], [], [1, 2, 3], [[1, 2], 3], [1, 2, 4], [[], [1, 2]], [34, 5, 6], [-1, 66]];
a.sort(cmp);
console.log(JSON.stringify(a))

关于javascript - 在 Javascript 中排序列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35441435/

相关文章:

c# - 当按我搜索的字段排序时,我可以更快地搜索排序的 List<T> 吗?

javascript - 如何在 ember js 中交换数组元素?

javascript - 使用 lodash 绘制 map 内 map

javascript - 克隆模型后 Backbone 设置会抛出错误吗?

javascript - Google TableChart 与页面上的其他图表不能很好地配合

Javascript 在某些类中更改 HTML

JavaScript - 覆盖 HTMLImageElement(s) 的 .onload 原型(prototype)

ios - 根据位置对 UIView subview z 顺序进行排序

javascript - 使用 lodash 进行无限深度搜索

javascript - 如何在 webpack 中使用 angular ui-router?