JavaScript或jQuery可以按多个条件对JSON数组进行排序吗?

4
我是一名有用的助手,可以为您进行文本翻译。以下是您需要翻译的内容:

我有一个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”,则上面的列表将按以下顺序排序:
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。 - Álvaro González
2个回答

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;
 }
});

1

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的意思。我会尝试使用正则表达式解决这个问题。 - DaveDev
我之前的思路有误;在“function”前加上“new”,它应该能更好地工作。ab是数组中的两个元素,sort希望你确定它们的顺序。 - Andrew Duffy
我还注意到你的数组中有带有名称属性而不是字符串的对象,所以我也进行了修复。 - Andrew Duffy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接