2010-06-14 5 views
1

J'ai quatre variables de type entier -logique simple javascript

var tip_1, tip_2, tip_3, tip_4; 

La valeur de ces variables obtiennent remplir par une autre logique qui est toujours entre 1 à 10. Je dois maintenir un hachage avec la variable le nom comme « clé » et de la valeur en tant que « valeur » en suivant ces règles -

  1. la variable avec la valeur MAX devrait être le premier élément du hachage et ainsi de suite. par exemple. si tip_1 = 4, tip_2 = 1, tip_3 = 2, tip_4 = 10 alors le hachage devrait être quelque chose comme, Hash = {tip_4, 10} {tip_1, 4} {tip_3, 2} {tip_1, 1}

  2. En cas d'égalité, l'ordre suivant doit être pris en compte - tip_1> tip_2> tip_3> tip_4;

+0

"premier élément dans le hachage" ?? Bien sûr, vous ne faites pas référence à un tableau? (Le hachage n'a pas d'élément premier, second élément, etc) –

Répondre

2

Vous pouvez toujours construire vos objets personnalisés pour conserver toutes les informations au lieu de les coder dans les indices. Rend le tri plus facile aussi.

function Tip(type, value) { 
    this.type = type; 
    this.value = value; 
} 

var tips = []; 

tips.push(new Tip(3, 4)); 
tips.push(new Tip(2, 4)); 
tips.push(new Tip(1, 3)); 
tips.push(new Tip(4, 10)); 

tips.sort(function(a, b) { 
    // sort first by value, and if equal, then by type (index) 
    return (b.value - a.value) || (a.type - b.type);  
}); 

console.log(tips); // 4=>10​, 2=>4, 3=>4, 1=>3​​​​​​​​​​​​​​​​​ 

Mis à jour le example.

+0

Salut. La logique et cette approche fonctionnent bien si je prenais un tableau comme votre code. Mais je suis obligé d'utiliser un hachage (Prototype). Je ne suis pas capable d'appliquer la même logique pour le hachage. Donc, le hash que j'ai est quelque chose comme - h = new Hash(); h.set ("tip_1", 4); h.set ("tip_2", 2); h.set ("tip_3", 1); h.set ("tip_4", 2); L'ordre par défaut est tip_1> tip_2> tip_3> tip_4 (en cas d'égalité) Après, la mise en œuvre du résultat logique Hash doit être aussi - résultat - [{tip_1, 4}, {tip_2, 2}, {tip_4 , 2}, {tip_3, 1}] – Saurabh

+0

Vous ne pouvez pas ordonner le contenu d'un hachage tout seul. Lisez la première ligne de docs sur Prototype [Hash] (http://www.prototypejs.org/api/hash) - "il ne peut pas garantir l'ordre cohérent de ses éléments lors de l'itération". Vous devez soit basculer vers des tableaux, ou écrire un wrapper qui contient le hachage et maintient également les clés triées dans un autre tableau. – Anurag

+0

Merci. J'apprécierais que vous fournissiez un exemple de code. – Saurabh

0

Il est beaucoup plus facile à faire si vous faites un vrai choix de vos conseils:

var tip_1 = 4, tip_2 = 1, tip_3 = 2, tip_4 = 10; 

// create an array so we can sort it 
var tips = [ 
    { key: 'tip_1', value: tip_1 }, 
    { key: 'tip_2', value: tip_2 }, 
    { key: 'tip_3', value: tip_3 }, 
    { key: 'tip_4', value: tip_4 }, 
]; 

tips.sort(function (a, b) { 
    // sort value descending 
    if (a.value < b.value) return 1; 
    if (a.value > b.value) return -1; 
    // if the values are equal, sort by key. 
    return a.key > b.key ? 1 : b.key < a.key ? -1 : 0; 
}); 

// tips is now: 
// [{key:"tip_4", value:10}, {key:"tip_1", value:4}, {key:"tip_2", value:2}, {key:"tip_3", value:2}] 

// loop over the tips 
for (var tip, i=0; tip = tips[i]; i++) { 
    console.log(tip.key+": "+tip.value); 
} 

// Outputs: 
// tip_4: 10 
// tip_1: 4 
// tip_3: 2 
// tip_2: 1 
+0

vous auriez à analyser la clé et faire une comparaison numérique puisque par défaut les comparaisons seront dans l'ordre lexicographique et des choses comme "" tip_10 "<" tip_8 "' reviendra vrai. – Anurag