【问题标题】:Can JavaScript or jQuery sort a JSON array on multiple criteria?JavaScript 或 jQuery 可以根据多个条件对 JSON 数组进行排序吗?
【发布时间】:2011-08-24 04:25:37
【问题描述】:

我有一个自动完成列表的潜在结果的 JSON 数组。

列表定义为:

var fundList = [ //there's lots more than this
    { "name": "Pension Managed Fund 1" },
    { "name": "Managed Property Fund 2" },
    { "name": "Retirement Managed Fund 3" },
    { "name": "Retirement Managed Fund 4" }
]

我需要按字母顺序对列表进行排序,但它还必须按照与输入到文本框中的值的相关性进行排序(这会触发自动完成)

例如,如果用户在文本框中键入“托管”,则上面的列表将按如下方式排序:

Managed Property Fund 2

Pension Managed Fund 1

Retirement Managed Fund 3

Retirement Managed Fund 4

如果他们输入“退休”,列表将被排序:

Retirement Managed Fund 3

Retirement Managed Fund 4

Managed Property Fund 2

Pension Managed Fund 1

如果键入“Fund”,则顺序将是正常的字母顺序:

Managed Property Fund 2

Pension Managed Fund 1

Retirement Managed Fund 3

Retirement Managed Fund 4

JavaScript 或 jQuery 中是否有任何内置功能可以做到这一点?

【问题讨论】:

  • 旁注:一旦解码,它就不再是 JSON。

标签: javascript jquery json sorting


【解决方案1】:

javascript 有一个数组排序方法,可以将函数作为参数,这将允许您定义您想要的排序方式

例如

var fundList = [ //there's lots more than this
    { "name": "Pension Managed Fund 1" },
    { "name": "Managed Property Fund 2" },
    { "name": "Retirement Managed Fund 3" },
    { "name": "Retirement Managed Fund 4" }
]

funcList.sort(function(a, b){
 if (a == b)
 {
   return 0;
 }

 if (SOME CRITERIA TO SORT a AT A LOWER INDEX THEN b)
 {
   return -1;
 }

 if (SOME CRITERIA TO SORT b AT A LOWER INDEX THEN a)
 {
    return 1;
 }
});

【讨论】:

    【解决方案2】:

    Array.prototype.sort可以带一个函数作为比较器;我猜你需要在没有它的每个字符串之前对包含搜索词的每个字符串进行排序,并按字母顺序打破平局:

    var query = 'Managed';
    fundList.sort(function(a, b)
    {
        var match_a = a.name.indexOf(query) >= 0;
        var match_b = b.name.indexOf(query) >= 0;
        if(match_a && !match_b)
            return -1;
        if(!match_a && match_b)
            return 1;
        if(a.name < b.name)
            return -1;
        if(a.name > b.name)
            return 1;
        return 0;
    });
    

    以此为起点;而不是String.prototype.indexOf 来确定字符串是否与查询匹配,我至少会忽略大小写和间距。

    【讨论】:

    • 嗨 Andrew,这看起来很有用,但我不确定参数 ab 是什么。只是在这里尝试代码,两者都是'未定义'。我明白你关于使用 indexOf 的观点。我会尝试为此使用正则表达式。
    • 我的大脑处于错误的模式;在“功能”之前没有“新”,它应该会更好地工作。 ab 是数组中的两个元素,sort 希望您确定其顺序。
    • 我也刚刚注意到您的数组中的对象具有名称属性而不是字符串,所以我也修复了这个问题。
    猜你喜欢
    • 2023-02-01
    • 2018-11-01
    • 1970-01-01
    • 2012-02-11
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    相关资源
    最近更新 更多