2013-09-03 4 views
1

J'ai JS objet défini comme suit: -objet JS tri tri Date

var item = {}; 
item[guid()] = 
{ 
    symbol: $('#qteSymb').text(), 
    note: $('#newnote').val(), 
    date: $.datepicker.formatDate('mm/dd/yy', dt) + " " + dt.getHours() + ":" + minutes, 
    pagename: getPageName() 
}; 

À un certain moment dans mon application, je reçois une liste de ceux (Items) de retour de chrome.storage et je voudrais être capable de trier en fonction de la date

Voici ce que je fais

var sortable = []; 

      $.each(Items, function (key, value) { 
       if (value.symbol == $('#qteSymb').text() || all) {       
        sortable.push([key, value]); 
       } 
      }); 

      console.log(sortable); 

      sortable.sort(function (a, b) { 
       a = new Date(a[1].date); 
       b = new Date(b[1].date); 
       return a > b ? -1 : a < b ? 1 : 0; 
      }); 

      console.log(sortable); 

il ne semble pas fonctionner. Le premier et le deuxième console.log(sortable); est le même. Je l'ai essayé de changer return a > b ? -1 : a < b ? 1 : 0;-return a < b ? -1 : a > b ? 1 : 0; juste pour voir si je reçois tout changement sortable, mais rien ne se passe ... Merci ~

+3

Je suggère que l'horodatage de stockage 'dt.getTime()' aussi bien et simplement la trier comme: 'revenir a [2] - b [2]; ' – kirilloid

+0

Avez-vous vérifié que vous obtenez réellement les objets desiredDate de' new Date (a [1] .date) '? -> utilisez 'console.log (a.toString() + 'et' + b.toString())' dans la fonction. – cars10m

Répondre

1

Les deux console.log montrent le même tableau que lorsque vous utilisez console.log(sortable), sortable est passée par référence, et la sortie de la console se produit APRES la fin de votre script - lorsque sortable a déjà été trié.

Faire votre code simple:

var arr = [3,2,1]; 
console.log(arr); // Produces `[1,2,3]` because its printed 
        // to the console after `arr.sort();` 
arr.sort(); 
console.log(arr); // Produces `[1,2,3]`, as expected 

Demo: http://jsfiddle.net/Rfwph/


Solution

Si vous voulez être en mesure de faire console.log avec un tableau pour le voir avant d'être modifié, vous pouvez utiliser .slice(0) à Copiez le tableau, c'est-à-dire pour obtenir un autre tableau qui contient les mêmes éléments que votre tableau.

var arr = [3,2,1]; 
console.log(arr.slice(0)); // [3,2,1] 
arr.sort(); 
console.log(arr); // [1,2,3] 

Demo: http://jsfiddle.net/Rfwph/2/

Edit: mieux utiliser .slice(0) au lieu de .slice(), qui est pris en charge sur FF, mais ecma262 spec dit seulement end argument est facultatif.

+0

Ok, c'est logique, merci Oriol. Cela signifie donc que console.log n'est pas un outil de débogage fiable? Comment voulez-vous confirmer le genre? J'ai mis des points de rupture dans les deux 'console.log (sortable)' mais le tableau est toujours le même. – americanslon

+0

@americanslon Si vous voulez déboguer des tableaux, il vaut mieux les * copier * en utilisant '.slice()' – Oriol

0

@Oriol:

Je viens de faire un violon identique http://jsfiddle.net/JaU4g/, mais pour moi cela n'a pas fonctionné!

var ar=[3,1,8,4,7,2,4,1] 
console.log(ar.join(',')); 
ar.sort(); 
console.log(ar.join(',')); 

donnant:

[18:55:31.616] "3,1,8,4,7,2,4,1" 
[18:55:31.616] "1,1,2,3,4,4,7,8" 
+0

C'est parce que vous utilisez 'ar.join (',')', donc vous convertissez 'ar' en une chaîne.Ensuite, lorsque vous modifiez 'ar', la chaîne n'est pas modifiée. – Oriol

+0

Ce n'est pas correct. '.join()' renvoie simplement une chaîne dérivée d'un objet tableau et laisse le tableau actuel inchangé. Sinon, je ne serais pas capable de le rejoindre une seconde fois ... – cars10m

+0

Oui, je voulais dire ça mais je n'ai pas bien expliqué. Mais je voulais indiquer que vous appelez 'console.log' avec une chaîne à la place de l'objet' ar'. Ensuite, si vous changez 'ar', la chaîne ne changera pas. – Oriol