2016-05-06 12 views
6

Sto cercando di ottenere la parola più popolare/comune da una matrice, ho provato quanto segue ma invece di dire semplicemente "Pioggia" lo visualizza all'interno della console [pioggia: 2, caldo: 1].Parola popolare in Array

Cosa sto sbagliando? Voglio solo visualizzare il numero uno delle parole più popolari senza il numero.

Qualsiasi aiuto/consiglio sarebbe utile, grazie.

var defaultArray = [{age:"25-35",country:"united kingdom",sex:"male",word:"rain"},{age:"25-35",country:"united arab emirates",sex:"male",word:"hot"},{age:"25-35",country:"zimbabwe",sex:"female",word:"rain"}]; 

    /* Popular */ 
    function popular() { 
    var words = []; 
    for(var p = 0; p < defaultArray.length; p++){ 
     var word = defaultArray[p].word; 
     words.push(word); 
     console.log(words); 
    } 
    var count = []; 
    for (var i = 0, j = words.length; i < j; i++) { 
     if (count[words[i]]) { 
     count[words[i]]++; 
     } 
     else { 
     count[words[i]] = 1; 
     } 
    } 
    console.log(count); 
    } 
    popular(); 

risposta

1

in linea con la funzionalità originale che avevi. potresti semplicemente modificarlo un po 'per ottenere la parola più popolare. NB: questo non tiene conto dei legami.

var defaultArray = [ 
    {age:"25-35",country:"united arab emirates",sex:"male",word:"hot"}, 
    {age:"25-35",country:"united kingdom",sex:"male",word:"rain"}, 
    {age:"25-35",country:"united arabemirates",sex:"male",word:"hot"}]; 

    /* Popular */ 
function popular() { 
    var count = 0 
    var max=0; 
    var currentword=""; 
    var words = []; 

    for(var p = 0; p < defaultArray.length; p++){ 
    var word = defaultArray[p].word; 
    words.push(word); 
    } 

    for (var i = 0; i<words.length; i++) { 
    if (max<=count){ 
     max=count; 
    } 
    count=0; 
    for (var x=0; x<words.length; x++) 
    { 
    if (words[i]==words[x]){ 
     count++; 
    } 
    if (count>max)currentword=words[i]; 
    } 

} 

console.log(currentword); 
} 
5

Hai solo bisogno di scorrere l'array conteggio e trovare la parola con il più alto numero di:

var mostCommonWordCount = 0; 
var mostCommonWord = ""; 
for (var key in count) { 
    if (count[key] > mostCommonWordCount) { 
     mostCommonWordCount = count[key] 
     mostCommonWord = key; 
    } 
} 
console.log(mostCommonWord); 

Dopo questo viene eseguito, mostCommonWord conterrà la parola con il più alto numero. L'unica avvertenza è che se ci sono più parole con 3 occorrenze, ad esempio, il primo nell'array count è quello che verrà assegnato a mostCommonWord. Quindi, se desideri qualcosa che restituirà più parole se hanno tutti lo stesso conteggio, dovrai modificarlo un po '.

Disclaimer: Probabilmente esiste un modo migliore per farlo, ma questa è la prima cosa che mi è venuta in mente.

0

È possibile rimuovere quasi tutto dopo aver creato un array di parole e invece aggiungere questa funzione:

function mostPopularWord(arr){ 
    return arr.sort(function(a,b){ 
     return arr.filter(function(v){ return v===a }).length 
     - arr.filter(function(v){ return v===b }).length 
    }).pop(); 
} 

poi passarlo la matrice di parole come:

mostPopularWord(words) // Returns rain 

Ecco un jsFiddle

Non ho scritto quella funzione, l'ho trovato quando ho cercato un modo per aiutare. Si può leggere di più su quello che stavi cercando di fare qui: Get the element with the highest occurrence in an array

0

per il conteggio e groupping è possibile utilizzare reduce la funzione, in questo modo:

var defaultArray = [{ 
 
    age: "25-35", 
 
    country: "united kingdom", 
 
    sex: "male", 
 
    word: "rain" 
 
    }, { 
 
    age: "25-35", 
 
    country: "united arab emirates", 
 
    sex: "male", 
 
    word: "hot" 
 
    }, { 
 
    age: "25-35", 
 
    country: "zimbabwe", 
 
    sex: "female", 
 
    word: "rain" 
 
    }]; 
 

 
    /* Popular */ 
 
    function popular(arr) { 
 
    return arr.reduce(function(acc, cur) { 
 
     if (!acc[cur.word]) acc[cur.word] = 0; 
 
     acc[cur.word] += 1; 
 
     if (acc.MaxCount < acc[cur.word]) { 
 
     acc.MaxCount = acc[cur.word]; 
 
     acc.PopularWord = cur.word; 
 
     } 
 
     return acc; 
 
    }, { 
 
     MaxCount: 0 
 
    }).PopularWord; 
 
    } 
 
    document.write('Max popular word: ',popular(defaultArray));

0

Mi raccomando un JavaScript libreria di utilità come lodash, nel qual caso si potrebbe fare qualcosa di simile:

var obj = _.countBy(_.map(defaultArray, 'word')); 
console.log(obj); // Object {rain: 2, hot: 1} 

var word = _.keys(obj).reduce(function (a,b) { return obj[a] > obj[b] ? a : b }); 
console.log(word); // "rain" 

Nota: vedere le altre risposte per la funzionalità JavaScript semplice

Problemi correlati