Calculer la fréquence de chaque élément en premier.
{
apples:1,
oranges:4,
bananas:2}
Puis créer un tableau à partir de cette fréquence, objet qui va également supprimer les doublons.
["apples","oranges","bananas"]
Maintenant trier ce tableau dans l'ordre décroissant en fonction de la fréquence de la carte que nous avons créé précédemment.
function compareFrequency(a, b){return frequency[b]- frequency[a];}
array.sort(compareFrequency);
Voici l'intégralité de la source (à l'aide de la nouvellement introduite Les fonctions de tableau ECMA 5) et la combinaison de la déduplication et de la fréquence de génération de carte d'étapes,
function sortByFrequency(array){var frequency ={};
array.forEach(function(value){ frequency[value]=0;});var uniques = array.filter(function(value){return++frequency[value]==1;});return uniques.sort(function(a, b){return frequency[b]- frequency[a];});}
Même que ci-dessus en utilisant le réseau régulier itération.
function sortByFrequencyAndRemoveDuplicates(array){var frequency ={}, value;//compute frequencies of each valuefor(var i =0; i < array.length; i++){
value = array[i];if(value in frequency){
frequency[value]++;}else{
frequency[value]=1;}}//make array from the frequency object to de-duplicatevar uniques =[];for(value in frequency){
uniques.push(value);}//sort the uniques array in descending order by frequencyfunction compareFrequency(a, b){return frequency[b]- frequency[a];}return uniques.sort(compareFrequency);}
peut être vaut la mise en cache de tableau.longueur au lieu de vérifier à chaque itération c'est une bonne optimisation pour les grands ensembles de données. Certains navigateurs peut-être déjà le faire en interne. C'est probablement aussi élégant que vous trouverez. Ouais j' +1 ed, je doute qu'il va être battu, mais tenir un peu juste au cas où 🙂 Nous avons besoin de nouveau badge: "stacksort conforme" 🙂
Array.prototype.byCount=function(){var itm, a=[], L=this.length, o={};for(var i=0; i<L; i++){
itm=this[i];if(!itm)continue;if(o[itm]==undefined) o[itm]=1;else++o[itm];}for(var p in o) a[a.length]= p;return a.sort(function(a, b){return o[b]-o[a];});}
//test
var A=["apples","oranges","oranges","oranges","bananas","bananas","oranges"];
A.byCount()
/* valeur retournée: (Array)
les oranges,les bananes,les pommes
*/
Si c'était un Code de Golf de compétition, vous avez gagné! Vraiment apprécier celui-ci. Modifié pour une dict avec les comtes referencable par dict[terme], grâce à l'homme. Grande aide, juste ce dont j'avais besoin
En fait, je travaillais sur ce en même temps la solution, je suis venu avec est quasiment identique à Anurag.
Cependant j'ai pensé qu'il pourrait être le partage de la valeur que j'avais une façon légèrement différente de calcul de la fréquence d'occurrences, à l'aide de l'opérateur ternaire et en vérifiant si la valeur a été compté, mais dans un sens légèrement différent.
function sortByFrequencyAndFilter(myArray){var newArray =[];var freq ={};//Count Frequency of Occurancesvar i=myArray.length-1;for(var i;i>-1;i--){var value = myArray[i];
freq[value]==null?freq[value]=1:freq[value]++;}//Create Array of Filtered Valuesfor(var value in freq){
newArray.push(value);}//Define Sort Function and Return Sorted Resultsfunction compareFreq(a,b){return freq[b]-freq[a];}return newArray.sort(compareFreq);}
La boucle que je utiliser pour compter de la fréquence d'occurrences des vérifications d'une valeur constante et parcourt le tableau en sens inverse. Ce serait d'effectuer plus rapidement sur de grands tableaux.
vous pouvez utiliser countBy fonction de underscroe.js
var all=["apples","oranges","oranges","oranges","bananas","bananas","oranges"];var frequency=_.countBy(all,function(each){return each});
donc frequency objet contient la fréquence de toutes les valeurs uniques, et vous pouvez obtenir une liste unique en appelant simplement _.uniq(all), et de sorte que la liste unique par le _.sortBy méthode de souligner et à l'aide de votre frequency objet que vous pouvez utiliser
Calculer la fréquence de chaque élément en premier.
Puis créer un tableau à partir de cette fréquence, objet qui va également supprimer les doublons.
Maintenant trier ce tableau dans l'ordre décroissant en fonction de la fréquence de la carte que nous avons créé précédemment.
Voici l'intégralité de la source (à l'aide de la nouvellement introduite Les fonctions de tableau ECMA 5) et la combinaison de la déduplication et de la fréquence de génération de carte d'étapes,
Même que ci-dessus en utilisant le réseau régulier itération.
c'est une bonne optimisation pour les grands ensembles de données. Certains navigateurs peut-être déjà le faire en interne.
C'est probablement aussi élégant que vous trouverez.
Ouais j' +1 ed, je doute qu'il va être battu, mais tenir un peu juste au cas où 🙂
Nous avons besoin de nouveau badge: "stacksort conforme" 🙂
OriginalL'auteur Anurag
//renvoie la plus fréquente à la moins fréquente
//test
/* valeur retournée: (Array)
les oranges,les bananes,les pommes
*/
Vraiment apprécier celui-ci. Modifié pour une dict avec les comtes referencable par dict[terme], grâce à l'homme. Grande aide, juste ce dont j'avais besoin
OriginalL'auteur kennebec
En fait, je travaillais sur ce en même temps la solution, je suis venu avec est quasiment identique à Anurag.
Cependant j'ai pensé qu'il pourrait être le partage de la valeur que j'avais une façon légèrement différente de calcul de la fréquence d'occurrences, à l'aide de l'opérateur ternaire et en vérifiant si la valeur a été compté, mais dans un sens légèrement différent.
OriginalL'auteur John
Stratégie de base:
Créer un objet pour l'utiliser comme une table de hachage pour suivre la fréquence de chaque élément du tableau à trier.
Créer un nouveau tableau contenant l'élément, les paires de fréquences.
Trier ce tableau selon la fréquence dans l'ordre décroissant.
Extraire les éléments du tableau.
Code:
OriginalL'auteur ngroot
OriginalL'auteur Zafer
pour la première étape pour calculer
vous pouvez utiliser countBy fonction de underscroe.js
donc
frequency
objet contient la fréquence de toutes les valeurs uniques, et vous pouvez obtenir une liste unique en appelant simplement_.uniq(all)
, et de sorte que la liste unique par le_.sortBy
méthode de souligner et à l'aide de votrefrequency
objet que vous pouvez utiliser-ve
signe est utilisé ici pour trier la liste en descente commande par le biais de la valeur de la fréquence selon votre condition.Vous pouvez consulter la documentation de http://underscorejs.org/ pour la poursuite de l'optimisation de votre propre truc 🙂
OriginalL'auteur Koushik Chatterjee
Pour ES6, il suffit de codes avec
.filter
et.sort
comme ci-dessousOriginalL'auteur zangw