2017-06-11 5 views
1

配列に非常に大きな配列の配列がありますが、それらをすべて数え、その値を各文字列の値として追加したい。非常に大きな配列の文字列のインスタンスをカウントし、その値をハッシュ値に加算する

だから私は、例えば:私は単に文字列内の単語をカウントし、その出現を返しますが、どのように可能性がありますする方法を見てきました

words = [{"a" => 2}, {"b" => 1}, {"hello" => 2}, {"went" => 1}] 

words = ["a", "hello", "hello", "b", "went", "a"] 

私はにこれを変換したいです私は大規模にこれを行いますが、発生数のハッシュの配列を作成していますか?

重複した値を削除することができます。値を数え、値をハッシュ値として追加するプロセスにもっと興味があります。

+0

はStackOverflowのへようこそ。 SOはコード作成サービスではありません。これまでに試したことのコードを提供してください。 – gus27

+0

私の悪い、すぐにここにいくつかのコードを入れます。 – Freddy

答えて

2

最初のターンでは、オブジェクト

var words = ["a", "hello", "hello", "b", "went", "a"]; 
 
var rObj = {}; 
 
var finalArray = []; 
 
words.map(function(currentValue, index) { 
 
    if (rObj.hasOwnProperty(currentValue)) { 
 
    rObj[currentValue] = rObj[currentValue] + 1; 
 
    } else { 
 
    rObj[currentValue] = 1 
 
    } 
 

 
}); 
 
for (var keys in rObj) { 
 
    var obj = {}; 
 
    obj[keys] = rObj[keys]; 
 
    finalArray.push(obj) 
 
}; 
 
console.log(finalArray)

のアレイを作成するために、それを介してoccurrence.Thenループの配列値と番号を持つオブジェクトを作成することができ
1

最初にreduce()を使用して要素をカウントしてオブジェクトを返し、次にmap()を使用してオブジェクト値の配列を返すことができます。

var words = ["a", "hello", "hello", "b", "went", "a"] 
 
var count = words.reduce(function(r, e) { 
 
    if(!r[e]) r[e] = {[e]: 1} 
 
    else r[e][e] += 1 
 
    return r; 
 
}, {}) 
 

 
var result = Object.keys(count).map(e => count[e]) 
 
console.log(result)

+0

'reduce'は良い選択です。配列の大きさによっては、forループを使って実装することもできます。 – Scarysize

+0

なぜあなたは '(r [e]?r [e] + = 1:r [e] = 1); return r; 'の中の' words.reduce'?それは 'map'呼び出しを保存します。または私はここで間違っていますか? – gus27

+0

@ gus27 Opは結果としてオブジェクトの配列を求めています。 –

1

本当に大きな配列の場合は、ループのと、その単語のキーが存在するかどうかをチェックします。それに0を割り当てない場合。後でカウントオブジェクトのプロパティをインクリメントします。

最後に、オブジェクトを必要な構造の配列に変換します。

var words = ["a", "hello", "hello", "b", "went", "a"], 
 
    w, 
 
    i = words.length, 
 
    count = Object.create(null), 
 
    result; 
 
    
 
while (i--) { 
 
    w = words[i]; 
 
    if (!count[w]) { 
 
     count[w] = 0; 
 
    } 
 
    count[w]++; 
 
} 
 

 
result = Object.keys(count).map(function (k) { 
 
    var temp = {}; 
 
    temp[k] = count[k]; 
 
    return temp; 
 
}); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

は、割り当てのように速度を最適化するマップを使用する方法がありますか?あるいは私はその仮定について間違っていますか? – Rick

+1

@Arrow、少なくとも、両方のメソッドを最初に試してみる必要がありますが、 'Map'はどのような型のキーも持つことができるのに対し、オブジェクトはより高速です。 –

0

ハッシュすることによってリピータをカウントしないでください。より少ないオーバーヘッドには、whileループを使用します。計算による割当。あなたは、5倍の速さのオーダーで答えを得るでしょう。 100万語は、1/5の時間で12語から無作為に生成された。

var wordsArray = ['apple', 'beer', 'cake', 'potato', 'orange', 'monitor', 'program', 'application', 'keyboard', 'javascript', 'gaming', 'network'], 
 
    words = []; 
 
for (i = 0; i < 1000000; i++) { 
 
    words.push(wordsArray[Math.floor(Math.random() * wordsArray.length)]); 
 
} 
 

 
function getCount(words) { 
 
    var w, 
 
    i = words.length, 
 
    hash = {}; 
 
    while (i--) { 
 
    w = words[i]; 
 
    if (!hash[w]) { 
 
     hash[w] = 0; 
 
    } 
 
    hash[w]++; 
 
    } 
 
    return hash 
 
} 
 

 
console.time('Obj-time'); 
 
var counts = getCount(words); 
 
array = []; 
 
for (let i in counts) { 
 
    var l = i.length, 
 
    val = counts[i]; 
 
    array.push({ 
 
    [i]: val * l 
 
    }) 
 
} 
 

 
console.log(array); 
 
console.timeEnd('Obj-time');

関連する問題