Как я могу отсортировать этот объект JavaScript на основе имени, а затем упорядочить по релевантности? - PullRequest
1 голос
/ 23 августа 2011

Ранее я задавал следующий вопрос: Может ли JavaScript или jQuery сортировать массив JSON по нескольким критериям?

Я думаю, что, возможно, допустил ошибку, задавая вопрос, потому что я указал массив JavaScript, а не объект, и кажется, что это различие является источником трудностей, с которыми я сталкиваюсь.

У меня есть следующий объект, определенный JSON, который существует на моей странице, который используется для функции автозаполнения:

var fundList = [
    { "name": "Pension Managed Fund 1", "id": 21, "cid": "N0", "dupId": 53 },
    { "name": "Managed Property Fund 2", "id": 407, "cid": "N0", "dupId": 58 },
    { "name": "Retirement Managed Fund 3", "id": 640, "cid": "N0", "dupId": 111 },
    { "name": "Retirement Managed Fund 4", "id": 752, "cid": "N0", "dupId": 115 }
]

Мне нужно отсортировать эти элементы в алфавитном порядке по их именам, но они также должны быть упорядочены по значению, введенному в текстовое поле (которое вызывает автозаполнение)

Так, например, если пользователь введет «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

Если набрать «Фонд», порядок будет в обычном алфавитном порядке:

Managed Property Fund 2

Pension Managed Fund 1

Retirement Managed Fund 3

Retirement Managed Fund 4

Что мне нужно сделать, чтобы иметь возможность отсортировать это по названию и указанным мною критериям? Я пытался использовать fundList.sort(new function(a, b), как предложено в предыдущем вопросе, но это возвращает функцию с неопределенной ошибкой.

Ответы [ 2 ]

0 голосов
/ 23 августа 2011
var fundList = [
        { "name": "Pension Managed Fund 1", "id": 21, "cid": "N0", "dupId": 53 },
        { "name": "Managed Property Fund 2", "id": 407, "cid": "N0", "dupId": 58 },
        { "name": "Retirement Managed Fund 3", "id": 640, "cid": "N0", "dupId": 111 },
        { "name": "Retirement Managed Fund 4", "id": 752, "cid": "N0", "dupId": 115 }
    ],
    textEntered = 'Managed';

fundList.sort(function(a, b)
{
    ai = a.name.indexOf(textEntered);
    bi = b.name.indexOf(textEntered);
    if(ai>=0 && bi<0) return -1;
    else if(bi>=0 && ai<0) return 1;
    else return a.name - b.name;
});
0 голосов
/ 23 августа 2011

Вы должны серьезно прочитать , как сортировать массивы в JavaScript.

Вот один из способов сделать это:

var fundList = [
        { "name": "Pension Managed Fund 1", "id": 21, "cid": "N0", "dupId": 53 },
        { "name": "Managed Property Fund 2", "id": 407, "cid": "N0", "dupId": 58 },
        { "name": "Retirement Managed Fund 3", "id": 640, "cid": "N0", "dupId": 111 },
        { "name": "Retirement Managed Fund 4", "id": 752, "cid": "N0", "dupId": 115 }
    ],
    textEntered = 'Managed';

fundList.sort(function(a, b)
{
    var aStart = a.name.match(new RegExp('^'+textEntered, 'i')) || [],
        bStart = b.name.match(new RegExp('^'+textEntered, 'i')) || [];

    if ( aStart.length != bStart.length ) return bStart.length - aStart.length;

    else return a.name > b.name ? 1 : -1;
});

http://jsfiddle.net/txJVB/3/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...