2012-04-09 10 views
5

Tengo un objeto de javascript con matriz de dos de como se muestra,Javascript matriz en una especie de objeto, manteniendo la tecla

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

Estoy tratando de ordenar por rango 1,2,3 .. pero mantener el nombre asociado con el rango.

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

¿Debo reconfigurar mi objeto para facilitar la clasificación?

actualmente estoy usando el

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

de orden de rango, pero el nombre no se queda con ella.

Toda ayuda apreciada. ¡Gracias!

+1

mejor cambiar el objeto de mantener los datos en un formato y objeto diferente es un mal nombre de la variable. – epascarello

+3

'var Object = {....' ¿en serio? – Mohsen

+0

Mi objeto no se llama objeto ... Simplemente pensé que sería más simple ... supongo que no ... – mattyd

Respuesta

4

Sí, reconfigure.Supongamos que tenía esto en su lugar:

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

Posteriormente, se podría clasificar como esto:

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

Editar

Puesto que usted tiene listas paralelas, simplemente comprímalos juntos:

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

¡gracias! Sabía que tenía que haber una forma más intuitiva de hacerlo. – mattyd

+0

tan. Tengo a mi gente objetar mientras muestras. [{name: val}, {name: val}], pero estoy luchando para alertar (people.name [0]) y también mi var, mientras estoy creado sin la función, y con una async: false POST, puedo no se debe usar fuera del código ... ¿Alguna idea? – mattyd

+1

Eso en realidad sería 'people [0] .name'. – jpsimons

0

Tendrá que escribir su propia función de clasificación que para cada operación de clasificación, recuerda qué índice viene donde por iteración en la matriz de rangos. Haga lo mismo desde el índice de origen al índice de destino en la matriz de nombres. (edit) Un algortihm para esto desde lo alto de mi cabeza es el bubblesort, búscalo.

La otra opción es buscar algún tipo de implementación de la colección "mapa".

1

Bueno, sí, si el objeto i-ésimo en la matriz names está conectado al objeto i-th en la matriz rank, debe representarlo de esa manera. Esto significa que debe usar un objeto Person (o lo que sea) con dos propiedades: name y 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

¡Genial! se ve sólido ¡Voy a darle una oportunidad! – mattyd

+0

En este caso, no estoy seguro de que hacer un objeto Persona especial tenga alguna ventaja sobre un objeto genérico. Supongo que más adelante en la línea es posible que desee hacer 'instanceof' en él? – jpsimons

+0

@darkporter Bueno, eso es difícil de decir a partir de un fragmento de código, ¿no? Tal vez un objeto Person especial sea útil para una mayor funcionalidad, tal vez nada ... – Imp

2

El objeto del mundo real:

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

Hacer una matriz para una mejor estructura de datos:

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

clasificar por rango:

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

Ordenar por nombre:

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

volver a su estructura de datos original:

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

forEach es agradable. ¿Es eso una extensión de Mozilla o es un navegador cruzado? – jpsimons

+0

['ForEach'] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/forEach) está disponible en la mayoría de los navegadores y puede tener un respaldo en los navegadores más antiguos. – Mohsen

+0

Gracias Mohsen! Me gusta tu para cada método mejor para reconfigurar el objeto actual – mattyd

Cuestiones relacionadas