0

配列で次のことを達成する方法が得られない問題があります。配列を一意の値に減らすつもりですが、一意の要素ごとに合計数を取得します。たとえば、次のような最終的な配列を取得します。

var data = [14:"A",5:"IMG",2:"SPAN"]

これは、タグ自体に関連付けられた、一意の各タグ内のアイテムの合計に対応します。私の元のサンプル配列は次のとおりです。

var data = ["A", "A","A","IMG","IMG","A","A","IMG","A","A","IMG","A","A","IMG","IMG","A","A","A","A","A","SPAN","SPAN"]

4

2 に答える 2

2

あなたは得ることができません

var data = [14:"A",5:"IMG",2:"SPAN"]

これは有効な JavaScript ではないためです。また、カウントが異なるタグで同様になる場合、重複したキーが取得されます。キーと値を入れ替えて、JavaScript オブジェクトを使用します。

var reduced = {A: 14, IMG: 6, SPAN: 2};  

Ecmascript 5 では:

var data = ["A","A","A","IMG","IMG","A","A","IMG","A","A","IMG","A","A","IMG","IMG","A","A","A","A","A","SPAN","SPAN"]; 

var reduced = data.reduce(function (result, item) {
    result[item] = (result.hasOwnProperty(item) ? result[item] : 0) + 1; 
    return result; 
}, {}); 

console.log(reduced); // Object {A: 14, IMG: 6, SPAN: 2}

ここでjsFiddle

「reduce」なしでブラウザーをサポートする必要がある場合は、underscore.jsで reduce を見つけることができます。

var reduced = _.reduce(data, function (result, item) {
    result[item] = (result.hasOwnProperty(item) ? result[item] : 0) + 1; 
    return result; 
}, {}); 

ここにアンダースコアを付けたjsFiddle

于 2013-08-29T10:05:44.740 に答える
2
var data = ["A", "A", "A", "IMG", "IMG", "A", "A", "IMG", "A", "A", "IMG", "A", "A", "IMG", "IMG", "A", "A", "A", "A", "A", "SPAN", "SPAN"];
var temp = [];
$.each(data,function(i,v){
 if ($.inArray(v, temp) == -1) temp.push(data[i]);
});
var count = [];
var c = 0;
$.each(temp,function(i,v){
  $.each(data,function (index, val) {
    if (v == val) c++;
   });
   count.push(c);
   c = 0;
});
var obj = {};
for (var i = 0; i < count.length; i++) {
  obj[temp[i]] = count[i]
 }
 console.log(obj); //Object { A=14, IMG=6, SPAN=2}

http://jsfiddle.net/aqPb2/2/

于 2013-08-29T09:57:03.483 に答える