17

次の単純な配列を検討してください。

var foods = ['hotdog', 'hamburger', 'soup', 'sandwich', 'hotdog', 'watermelon', 'hotdog'];

underscore、最も頻繁に発生する値 (この場合はhotdog) を選択するために使用できる関数または関数の組み合わせはありますか?

4

3 に答える 3

4

を使用して、これを 1 回のパスで行うことができます_.reduce。基本的な考え方は、単語の頻度と最も一般的な単語を同時に追跡することです。

var o = _(foods).reduce(function(o, s) {
    o.freq[s] = (o.freq[s] || 0) + 1;
    if(!o.freq[o.most] || o.freq[s] > o.freq[o.most])
        o.most = s;
    return o;
}, { freq: { }, most: '' });

それは'hotdot'に残りo.mostます。

デモ: http://jsfiddle.net/ambiguous/G9W4m/

キャッシュ変数を事前に宣言することを気にしない場合はeach、(または単純なループでも) それを行うこともできます。for

var o = { freq: { }, most: '' };
_(foods).each(function(s) {
    o.freq[s] = (o.freq[s] || 0) + 1;
    if(!o.freq[o.most] || o.freq[s] > o.freq[o.most])
        o.most = s;
});

デモ: http://jsfiddle.net/ambiguous/WvXEV/

oまた、2 つの部分に分割して、上記を少し変更したバージョンを使用することもできo.mostます'hotdog'

于 2013-09-18T18:19:55.123 に答える
0

以前の回答に基づいて、モードでの描画を考慮した文字列または数値の配列のモードを計算し (値の頻度が等しい場合)、頻度も返す私のバージョンを次に示します。次に、それらをどうするかを選択できます。

アンダースコアとロダッシュが含まれています。

// returns
// [['item', frequency]] where item is a string and frequency is an interger
// [['item', frequency], ['item', frequency], ['item', frequency] ... ] for draws

// examples:
// unique mode: creed appears the most times in array
// returns: [['creed', 4]]

// draw mode: 'jim' and 'creed' both occur 4 times in array
// returns: [['jim', 4], ['creed', 4]]

// underscore:
const usMode = arr => _.chain(arr).countBy().pairs().value().sort((a, b) => b[1] - a[1]).filter((e,i,a) => e[1] === a[0][1])

// lodash
const ldMode = arr => _.chain(arr).countBy().toPairs().value().sort((a, b) => b[1] - a[1]).filter((e,i,a) => e[1] === a[0][1])

// usage
usMode([1,2,3,3,3,4,5,6,7])
// [['3', 3]]

アンダースコアを使用:

// underscore

const strsUniqueArr = ['jim','pam','creed','pam','jim','creed','creed','creed']
const strsDrawArr = ['pam','jim','creed','jim','jim','creed','creed','creed', 'pam', 'jim']
const numsUniqueArr = [1, 2, 2, 2, 2, 3 ,4, 5]
const numsDrawArr = [1, 1, 1, 1, 2, 2, 2, 2, 3 ,4, 5]

const usMode = arr =>  _.chain(arr).countBy().pairs().value().sort((a, b) => b[1] - a[1]).filter((e,i,a) => e[1] === a[0][1])

console.log('empty', usMode([]))
console.log('unique strs', usMode(strsUniqueArr))
console.log('draw sts', usMode(strsDrawArr))
console.log('unique nums', usMode(numsUniqueArr))
console.log('draw nums', usMode(numsDrawArr))
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.1/underscore-min.js"></script>

ロダッシュを使用:

// lodash

const strsUniqueArr = ['jim','pam','creed','pam','jim','creed','creed','creed']
const strsDrawArr = ['pam','jim','creed','jim','jim','creed','creed','creed', 'pam', 'jim']
const numsUniqueArr = [1, 2, 2, 2, 2, 3 ,4, 5]
const numsDrawArr = [1, 1, 1, 1, 2, 2, 2, 2, 3 ,4, 5]

const ldMode = arr =>  _.chain(arr).countBy().toPairs().value().sort((a, b) => b[1] - a[1]).filter((e,i,a) => e[1] === a[0][1])

console.log('empty', ldMode([]))
console.log('unique strs', ldMode(strsUniqueArr))
console.log('draw sts', ldMode(strsDrawArr))
console.log('unique nums', ldMode(numsUniqueArr))
console.log('draw nums', ldMode(numsDrawArr))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>

于 2019-11-25T10:31:54.450 に答える