2012-02-17 4 views
2

Прежде чем сортировать, я могу получить доступ к значениям массива по ключевым словам.Сортировка массива удаляет записи?

var a=[]; 
a['1']={'id':'1','aaa':'xxx'} 
a['2']={'id':'2','bbb':'yyy'} 

document.write(a['1'].id+' '+a['2'].id+'<br>') 

После сортировки, ключи превращаются в индексы:

a.sort(function(a, b) { 
    var x = a.id; 
    var y = b.id; 
    return ((x < y) ? -1 : ((x > y) ? 1 : 0)); 
}); 

alert('a["1"]='+a['1'].id+'\n\na["2"]='+a['2']) 

а [ "2"] становится неопределенным. В чем проблема? Сортировка неверна?

Вот пример: http://jsfiddle.net/TJLtS/1/

+1

Примечание: в JavaScript 'a [" 1 "]' совпадает с 'a [1]'; нет причин использовать кавычки. – Phrogz

ответ

3

Ваша проблема в том, что массивы в JavaScript являются 0 на основе, а не на основе 1. После сортировки ваш первый элемент - a[0], а ваш второй - a[1]. Нет a[2], после сортировки.

Вы сами это заметили, если бы открыли свои инструменты разработчика в своем браузере —, которые есть у всех современных браузеров; Google, если вам нужна помощь в поиске — и добавление кода console.log(a) после сортировки. Использование alert - это самый болезненный и наименее эффективный способ отладки вашего кода.

Вот обновленная версия вашего сценария, работа: http://jsfiddle.net/TJLtS/2/

Кроме того, для дальнейшего использования вы можете объявлять литералы объектов более просто:

var a = [ 
    {id:'1', aaa:'xxx'},  // This is a[0] 
    {id:'2', bbb:'yyy'}  // This is a[1] 
]; 

Как вы можете видеть, ключи, которые являются юридическими идентификаторами, не обязательно должны указываться в объектных литералах.


Редактировать Вот две альтернативы вы можете быть заинтересованы в зависимости от ваших потребностей:

Держите все объекты в отсортированном массиве

var objects = [ 
    {id:"a1", name:"Jim"}, 
    {id:"a2", name:"Zed"}, 
    {id:"a3", name:"Bob"}, 
]; 
objects.sort(function(o1,o2){ 
    var n1 = o1.name, n2 = o2.name; 
    return n1<n2 ? -1 : n1>n2 ? 1 : 0; 
}); 
for (var i=0,len=objects.length; i<len; ++i){ 
    console.log(objects[i].id); 
} 
// Result: 
// a3, a1, a2 

Держите все объекты в хеш, с отдельным заказом

var objects = { 
    a1: {id:"a1", name:"Jim"}, 
    a2: {id:"a2", name:"Zed"}, 
    a3: {id:"a3", name:"Bob"}, 
}; 

// Easily look up an object by id (can't do this as easily or fast with array) 
var id = "a2"; 
console.log(objects[id]); // {id:"a2", name:"Zed"} 

// Create an array just the ids 
var ids = Object.keys(objects); 

// Sort the array of ids based on properties of the objects the represent 
ids.sort(function(id1,id2){ 
    var n1 = objects[id1].name, n2=objects[id2].name; 
    return n1<n2 ? -1 : n1>n2 ? 1 : 0; 
}); 

// Iterate the sorted array and use each key to find the object 
for (var i=0,len=ids.length; i<len; ++i){ 
    console.log(objects[ids[i]].name); 
} 
// Result: 
// Bob, Jim, Zed 
+0

Спасибо, но мне нужен многомерный массив, где ['1'] - первый элемент. Это может быть ['589'] как первый массив. – Vad

+2

@Vad Это не имеет никакого смысла. a) Как я уже отмечал, 'a [" 1 "]' и 'a [1]' _ то же самое} в JavaScript. б) После сортировки массива первый объект всегда будет иметь индекс '0' (даже если этот объект может иметь свойство типа' id: 589'). – Phrogz

+0

OK Я получил его, но мне нужна так называемая хэш-карта JavaScript. Как это сделать? Не могу ли я использовать числа в качестве ключей? – Vad

1

Массивы сценариев Java начинаются с 0. Ваш 0-й элемент теперь отсортирован как последний.

Обратите внимание, что в вашем примере нет «многомерного массива» - всего лишь массив объектов.

+0

Мне нужен многомерный массив, где ключ ['1'] - вот почему я использую кавычки. Бывает, что он выглядит как индекс, но может быть любым, например, ['1A'] – Vad

+0

@Vad Первым измерением является упорядочение объектов в вашем массиве. Сами объекты не содержат никакого упорядочения среди свойств, и, следовательно, у вас есть простой массив объектов, а не многомерный массив (который можно назвать массивом массивов). – Phrogz

+0

@Vad - пожалуйста, ознакомьтесь с http://stackoverflow.com/questions/1520714/javascript-sorting-collection-which-is-not-an-array, так как вы «массив» на самом деле не массив. –

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