2012-04-09 4 views
5

У меня есть JavaScript Object с два массива, как показано на рисунке,рода Javascript массив в объекте, сохраняя ключ

var Object = {'name': [Matt, Tom, Mike...], 'rank': [34,1,17...]}; 

Я пытаюсь сортировать по рангу 1,2,3 .. но сохранить имя, связанное с ранг.

Object.name[0] // tom 
Object.rank[0] // tom's rank of 1. 

Должен ли я перенастроить свой объект, чтобы упростить сортировку?

я в настоящее время с помощью

Object.rank.sort(function(a,b){return a-b}); 

на заказ ранг, но имя не остаться с ним.

Вся помощь приветствуется. Благодаря!

+1

Лучше изменить объект для хранения данных в другом формате и объекте является плохим именем переменным. – epascarello

+3

'var Object = {....' действительно? – Mohsen

+0

Мой объект не назван объектом .. Я просто подумал, что будет проще ... Угадай, не .. – mattyd

ответ

4

Да, перенастройте.Допустим, у вас вместо этого:

var people = [{name:"Matt", rank:34}, {name:"Tom", rank:1}, {name:"Mike", rank:17}]; 

Тогда можно сортировать так:

people.sort(function(a, b) { 
    return a.rank - b.rank; 
} 

Редактировать

Поскольку у вас есть параллельные списки, просто пронестись их вместе:

var people = []; 
for (var i = 0; i < Object.name.length; i++) { 
    people.push({name:Object.name[i], rank:Object.rank[i]}); 
} 
+0

спасибо! Я знал, что вокруг этого должен быть более интуитивный способ. – mattyd

+0

так. У меня есть люди, которых вы показываете. [{name: val}, {name: val}], но я изо всех сил пытаюсь предупредить (people.name [0]), а также мой var, созданный без функции, и с помощью async: false POST, может не использовать вне кода ... Любые идеи? – mattyd

+1

На самом деле это будет 'people [0] .name'. – jpsimons

0

Вам необходимо написать свою собственную функцию сортировки, которая для каждой операции сортировки запоминает, какой индекс приходит, где каждая итерация в массиве рангов. Проделайте тот же переход от индекса источника к целевому индексу в массиве имен. (отредактируйте) Один альгортим для этого с вершины моей головы - это пузырьковый корабль, посмотрите его.

Другой вариант - это поиск какой-либо реализации коллекции «карта».

1

Ну, да, если i-й объект в массиве names связан с i-м объектом в массиве rank, вы должны представить его таким образом. Это означает, что вы должны использовать объект Person (или что-то еще) с двумя свойствами: name и rank.

// person constructor 
function Person(name, rank) { 
    this.name = name; 
    this.rank = rank; 
} 

// create the object with the array 
var myObject = { 
    myArray: new Array() 
}; 

// populate the array 
myObject.myArray.push(new Person('Matt', 34)); 
myObject.myArray.push(new Person('Tom', 1)); 
myObject.myArray.push(new Person('Mike', 17)); 

// sort the Person objects according to their ranks 
myObject.myArray.sort(function(a, b) { 
    return b.rank - a.rank;  
}); 
+0

Отлично! выглядит солидно. Я приготовлю его! – mattyd

+0

В этом случае не уверен, что создание специального объекта Person имеет какое-либо преимущество перед универсальным объектом. Полагаю, что позже вы можете сделать «экземпляр» на нем? – jpsimons

+0

@ darkporter Хорошо, что сложно сказать из одного фрагмента кода, не так ли? Может быть, специальный объект Person пригодится для дальнейшей функциональности, может быть, совсем нет ... – Imp

2

Объект реального мира:

o = {name: ['Matt', 'Tom', 'Mike'], rank: [34,1,17]}; 

Сделать массив для улучшения структуры данных:

var arr =[]; 
o.name.forEach(function(name, i){ 
     arr.push({name: name, rank: o.rank[i]}) 
}); 

Сортировать по рангу:

arr.sort(function(a,b){return a.rank - b.rank}); 

Сортировать по названию:

arr.sort(function(a,b){return a.name- b.name}); 

вернуться к исходной структуре данных:

o = {name:[], rank:[]} 
arr.forEach(function(item){ 
    o.name.push(item.name); 
    o.rank.push(item.rank); 
}); 
+0

для каждого приятно. Это расширение Mozilla или это кросс-браузер? – jpsimons

+0

['ForEach'] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/forEach) доступен в большинстве браузеров и может иметь резервную копию в старых браузерах. – Mohsen

+0

Спасибо Мохсен! Мне нравится, что ваш метод forEach лучше всего подходит для реконфигурации текущего объекта – mattyd