Как отсортировать ассоциативный массив в Javascript? - PullRequest
4 голосов
/ 27 октября 2010

Мне нужно отсортировать ассоциативный массив по JS для одного из моих проектов.Я нашел эту функцию, которая прекрасно работает в Firefox, но, к сожалению, она не работает в IE8, OPERA, CHROME ... Не могу найти способ заставить ее работать в других браузерах или найти другую функцию, которая бы подходила для этой цели.Я действительно ценю любую помощь.

function sortAssoc(aInput)
{
    var aTemp = [];
    for (var sKey in aInput) aTemp.push([sKey, aInput[sKey].length]);
    aTemp.sort(function () {return arguments[0][1] < arguments[1][1]});
    var aOutput = new Object();
    //for (var nIndex = aTemp.length-1; nIndex >=0; nIndex--)
    for (var nIndex = 0; nIndex <= aTemp.length-1; nIndex++)
        aOutput[aTemp[nIndex][0]] = aInput[aTemp[nIndex][0]];
    //aOutput[aTemp[nIndex][0]] = aTemp[nIndex][1];
    return aOutput;
}

Ответы [ 3 ]

5 голосов
/ 27 октября 2010

Это невозможно. Object в JavaScript (который вы используете в качестве «ассоциативного массива») определяется как не имеющий определенного порядка при итерации по его свойствам с использованием цикла for...in. Возможно, вам удастся найти общий язык между поведением некоторых браузеров, но это не универсально .

Резюме: если вам нужны объекты в определенном порядке, используйте массив.

1 голос
/ 17 мая 2011

Я знаю, что это старый пост, но он работает:

проблема в

aTemp.sort(function () {return arguments[0][1] < arguments[1][1]});

, потому что функция сортировки присутствует в числе:

aTemp.sort(function (a, b) {
    if (a[1] < b[1])
        return 1;
    else if (a[1] > b[1])
        return -1;
    else
        return 0;
});
0 голосов
/ 21 ноября 2012

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

var firstChild = {'id': 0, 'name': 'company Two'};
var secondChild = {'id': 1, 'name': 'company One'};
var parent = {
    'company Two': firstChild,
    'company One': secondChild
};

Следующая функция отсортирует вышеприведенный родительский массив на основе его ключей. Чтобы это работало как написано, родительскому массиву нужны ключи, которые соответствуют значению в соответствующем массиве. Например, у родителя ['уникальная строка'] должно быть какое-то ключевое значение, которое содержит значение 'уникальной строки'. В моем случае это имя ключа; однако вы можете выбрать любую понравившуюся клавишу.

function associativeSort(givenArray, keyToSort) {
    var results = [];

    var temp = [];
    for(var key in givenArray) {
        temp.push(givenArray[key].name);
    }
    temp = temp.sort();
    for(var x = 0; x < temp.length; x++) {
        results[x] = givenArray[temp[x]];
    }

    return results;
}

Учитывая мой пример массива, эта функция вернет:

var parent = {
    'company One': {'id': 1, 'name': 'company One'},
    'company Two': {'id': 0, 'name': 'company Two'}
};

Это простое решение, но мне потребовалось некоторое время, чтобы подумать. Надеюсь, что это помогает другим, сталкивающимся с этой проблемой.

...