2

重複の可能性:
配列値カウント javascript

いくつかの重複を含む配列があります。私が達成しようとしているのは、この 1 つの配列に一意の各文字列がいくつ重複しているかを数えることです。

配列はこんな感じ

array = ['aa','bb','cc','aa','ss','aa','bb'];

したがって、私はこのようなことをしたいと思います

if (xWordOccurrences >= 5) {
    // do something
}

しかし、これをどのようにコーディングするかはわかりません。私は、一意の文字列ごとにオブジェクトを作成し、元の配列をループし、各文字列をそのオブジェクトと一致させ、その番号を1ずつ増やしてから、オブジェクトをループして、どの単語が最も重複しているかを確認することを考えていました...

しかし、これは複雑すぎる方法のようです。

4

7 に答える 7

3

配列の値のキーを持つオブジェクトを使用して、このようなことを行うことができます

// count everything
function getCounts(arr) {
    var i = arr.length, // var to loop over
        obj = {}; // obj to store results
    while (i) obj[arr[--i]] = (obj[arr[i]] || 0) + 1; // count occurrences
    return obj;
}

// get specific from everything
function getCount(word, arr) {
    return getCounts(arr)[word] || 0;
}

getCount('aa', ['aa','bb','cc','aa','ss','aa','bb']);
// 3

1つだけ取得したい場合は、にgetCounts似た変更されたバージョンを使用する方が少し効率的getCountです。私はそれを呼び出しますgetCount2

function getCount2(word, arr) {
    var i = arr.length, // var to loop over
        j = 0; // number of hits
    while (i) if (arr[--i] === word) ++j; // count occurance
    return j;
}

getCount2('aa', ['aa','bb','cc','aa','ss','aa','bb']);
// 3
于 2013-01-09T03:55:18.840 に答える
1

名前付きプロパティでオブジェクトを構築するのはどうですか?

var array = ['aa','bb','cc','aa','ss','aa','bb'];

var summary = {};
var item = '';
for ( i in array){
    item = array[i];
    if(summary[item]){
        summary[item] += 1;
    }
    else{
        summary[item] = 1;
    }
}
console.log( summary );

要約はこのように含まれます

{aa: 3, bb: 2, cc: 1, ss: 1}

これを反復して、必要に応じて後で並べ替えることができます。

最終的にカウントを取得するには、この要約を使用できます['aa']

于 2013-01-09T03:58:46.150 に答える
1

この機能を試してください:

var countOccurrences = function(arr,value){
    var len = arr.length;
    var occur = 0;
    for(var i=0;i<len;i++){
        if(arr[i]===value){
            occur++;
        }
    }
    return occur;
}

var count = countOccurrences(['aaa','bbb','ccc','bbb','ddd'],'bbb');    //2

必要に応じて、この関数をArrayプロトタイプに追加することもできます。

Array.prototype.countOccurrences = function(value){
    var len = this.length;
    var occur = 0;
    for(var i=0;i<len;i++){
        if(this[i]===value){
            occur++;
        }
    }
    return occur;
}
于 2013-01-09T03:55:05.827 に答える
0

この関数はあなたが必要とするすべてをするかもしれません。

function countDupStr(arr, specifier) {
    var count = {}, total = 0;
    arr.forEach(function (v) {
        count[v] = (count[v] || 0) + 1;
    });

    if(typeof specifier !== 'undefined') {
        return count[specifier] - 1;
    }

    Object.keys(count).forEach(function (k) {
        total += count[k] - 1;
    });

    return total;
}

配列内の各値は、カウントオブジェクトに割り当てられ、インクリメントされます。指定子が渡されたかどうかに関係なく、関数はその特定の文字列の重複または重複の総数を返します。Javascriptは文字列によってのみオブジェクトにインデックスを付けることができるため、この特定の手法は配列内の文字列強制値に対してのみ機能することに注意してください。

これが意味するのは、オブジェクトの割り当て中に、キーは文字列に正規化され、一意性を信頼できないということです。つまり、この関数はとの重複の違いを識別できませ3'3'。例を挙げると、私が実行する場合:

var o = {}, t = {};
o[t] = 1;
console.log(o);

の代わりに使用されるキーは、t最終的にはになりますt.toString()。したがって、おそらく驚くべきオブジェクトになり{'[object Object]': 1}ます。Javascriptプロパティを操作するときに覚えておくべきことです。

于 2013-01-09T04:26:59.383 に答える
0
<script type="text/javascript">

    var array = ['aa','bb','cc','aa','ss','aa','bb'];

    var myMap = {};

    for(i = 0; i < array.length; i++) {
        var count = myMap[array[i]];
        if(count != null) {
            count++;
        } else {
            count = 1;
        }
        myMap[array[i]] = count;
    }

    // at this point in the script, the map now contains each unique array item and a count of its entries

</script>
于 2013-01-09T03:57:50.347 に答える
0

私はそれについてこの投稿を見ました、おそらくそれが役立つかもしれません:

http://ryanbosinger.com/blog/2011/javascript-count-duplicates-in-an-array/

于 2013-01-09T03:56:25.687 に答える
0

これで問題が解決することを願っています

var array = ['aa','bb','cc','aa','ss','aa','bb'];
var dups = {};

for (var i = 0, l = array.length; i < l; i++ ) {
  dups[array[i]] = []; 
}

for (str in dups) {
  for (var i = 0, l = array.length; i < l; i++ ) {
    if (str === array[i]) {
      dups[str].push(str); 
    }
  }
}

for (str in dups) {
  console.log(str + ' has ' + (dups[str].length - 1) + ' duplicate(s)');
}
于 2013-01-09T04:12:02.307 に答える