2010-10-27 3 views
4

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

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; 
} 
+0

Где это происходит и что сообщение об ошибке? –

+0

Арг, глаза мои! Форматирование ..! – andrewmu

+0

Нет сообщения об ошибке, просто не сортировать массив !! Массив остается несортированным :( – Santi

ответ

5

Это невозможно. Object в JavaScript (это то, что вы используете как ваш «ассоциативный массив») specified as having no defined order при повторении своих свойств с использованием цикла for...in. Возможно, вам удастся наблюдать некоторые общие черты между поведением некоторых браузеров, но it's not universal.

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

+0

Спасибо. Это может быть очень полезно. найти решение с массивом – Santi

1

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

проблема является

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

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

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

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

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

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

+0

'['company One': []]' является синтаксической ошибкой в ​​javascript – slebetman

+0

Я знаю, это означает показать структуру, а не то, как вы на самом деле определяете массив. –

+0

Это означает, что он не " t показывает структуру. Псевдокод неоднозначен. Он может означать '{key: [], key: []}' или это может означать '[{key: []}, {key: []}]'. ваш код выглядит так, как будто это последний, поэтому вы должны были написать его как таковой. – slebetman

Смежные вопросы