2012-01-05 74 views
1

我目前對JS和下劃線很新。我想知道哪個數字出現在給定的數組中最多(現在稱爲var a)。作爲一名狂熱的python用戶,我習慣於用頻率電報對其進行總結,然後以元組[[1,3),(2,2)...]輸出它,然後按照那樣排序。下劃線Javascript構建頻率圖

在javascript中這樣做的最好方法是什麼?

function votesTied() { 
    var a = [1, 2, 3, 1, 2, 4, 6, 1, 7]; 
    var tele = {}; 
    _.each(a, function(key) { 
    if (tele[key]) { 
     tele[key]++; 
    } else { 
     tele[key] = 1; 
    } 
    }); 

    var items = _.map(tele, function(frequency,key) { return [key,frequency]; }); 
    var results = _.sortBy(items, function(tuple) { return -1 * tuple[1]; }).value(); 

    return results.length > 1 && results[0][1] == results[1][1]; 
} 

我這樣問是因爲我可以在python的1行中完成所有這些。我相信有一個更優雅的方式來寫在下劃線或JavaScript。

回答

1

也許這樣?

result = _.chain(a) 
    .groupBy(function(x) { return x }) 
    .map(function(v, k) { return [k, v.length] }) 
    .sortBy(function(x) { return -x[1] }) 
    .value(); 
5

這是不幸的強調map()功能無法與維護屬性返回一個對象,因爲這將允許這樣的事情:

var t = _.chain (a) 
      .groupBy (function (p) { return p; }) 
      .map (function (e) { return _.size (e); }) 
      .value(); 

但短期重寫功能的考慮到這一點,最好的我可以拿出來的是:

var t = {}; 
_.chain (a) 
    .groupBy (function (p) { return p; }) 
    .each (function (e, i) { 
    t[i] = _.size (e); 
    }); 

這將收集一切都在t

UPDATE

我不能讓它可以了,所以我檢查了源下劃線map()並提出以下修改,以允許上述第一個片段:

_.map = function(obj, iterator, context) { 
    // determine the return type 
    if (_.isArray (obj)) { 
     var results = []; 
    } 
    else { 
     var results = {}; 
    } 
    if (obj == null) return results; 
    // @xxx: we need to override the native map(), thus the next line is commented out 
    // if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context); 
    each(obj, function(value, index, list) { 
     results[index] = iterator.call(context, value, index, list); 
    }); 
    if (obj.length === +obj.length) results.length = obj.length; 
    return results; 
    }; 

雖然我沒有徹底檢查過它,但它應該可以工作。

1

我想到了第二種實現你想要的結果的方式,它不需要修改代碼。代碼的清晰度可能會稍微降低,但所需步驟較少,並且仍然非常清晰。

通過使用下劃線的reduce()這樣的:

_.reduce([1, 2, 3, 1, 2, 4, 6, 1, 7], function(frequencies, value) { 
    frequencies[value] = frequencies[value] && frequencies[value] + 1 || 1; 
    return frequencies; 
}, {}); 

作爲文件說,到reduce()第一個參數是將被減小的陣列,第二個是減少回調,三是的初始狀態備註/彙總 - 這是一個空的對象,我們在減少期間使用頻率數據填充。

結果應該是這樣的:

{1: 3, 2: 2, 3: 1, 4: 1, 6: 1, 7: 1} 

即與爲每個唯一的元素和值與它們各自的頻率鍵的對象。

清晰度可能略有下降,但與單行要求的非常接近,只需要股票下劃線即可。