2016-02-07 46 views
0

我有對象的一個​​這樣的數組:計數出現在JavaScript數組

arrayOfObjs = [{1:"h"}, {1:"h"}, {2:"h"}, {3:"ha"}, {4:"haa"}, {4:"haa"}, {4:"haa"}] 

我想計數每個對象的發生,並得到結果早在排序,可迭代數據結構,像這樣:

{ 
    {4:"haa"}: 3, 
    {1:"h"}: 2, 
    {2:"h"}: 1, 
    {3:"ha"}: 1 
} 

鍵甚至可以在數組中。 我嘗試在arrayOfObjs上使用Lodash的countBy函數。然而,這只是導致

{[object Object]:5} 

我可以用來完成這項工作的任何庫/函數?類似Python的

UPDATE

作爲替代的東西,我想整理我的數組是這樣的:

array = [[1,"h"], [1,"h"], [2,"h"], [3,"ha"], [4,"haa"], [4,"haa"], [4,"haa"]]; 

再次使用Lodash的countBY功能,我的結果是:

{1,h: 2, 2,h: 1, 3,ha: 1, 4,haa: 3} 

這是一個位更好的,但我現在必須使用正則表達式來拆分對象的每個鍵,因爲「1,h」是一個字符串。不理想:(

理想,我想我的鑰匙是任何物體,或陣列,或諸如此類的東西。

+0

你的意思是你想用相同的屬性,彼此算對象的出現這個任務?因爲在你的示例數組中,每個對象只出現一次:前兩個數組元素不是同一個對象,它們是兩個不同的對象,它們恰好具有相同的屬性。 – nnnnnn

+0

嘗試比較JSON.stringify字符串 – mplungjan

+0

不幸的是,您的密鑰無法成爲對象或除此之外的任何字符串。 JavaScript對象是散列表,而散列表鍵是字符串。 JavaScript不允許原始值作爲鍵,所以即使您將對象鍵設置爲數字,它仍將轉換爲字符串。使用JSON的建議大多緩解了這種擔憂,因爲您可以隨後將密鑰反序列化爲對象。 –

回答

1

無恥插頭:

我工作的一個庫調用Pro.js有一個收集模塊,可以做各種整潔的事情。可枚舉類有一個.groupBy()方法,在這裏特別有用。

var arrayOfObjs = [{1:"h"}, {1:"h"}, {2:"h"}, {3:"ha"}, {4:"haa"}, {4:"haa"}, {4:"haa"}]; 
var enumerable = pro.collections.asEnumerable(arrayOfObjs); 
var grouped = enumerable.groupBy(function(o) { 
    return JSON.stringify(o); 
}); 
var composites = grouped.select(function(g) { 
    return { 
     key: g[0], 
     count: g.length, 
     group: g 
    }; 
}); 
var output = composites.toArray(); 

你可以去Pro.js GitHub Page並使用你的開發工具來測試庫。運行我在頁面上的答案中發佈的代碼段,並查看它是否會爲您生成可喜的結果。

1

arrayOfObjs = [{1:"h"}, {1:"h"}, {2:"h"}, {3:"ha"}, {4:"haa"}, {4:"haa"}, {4:"haa"}]; 
 

 
var hash = {}; 
 
arrayOfObjs.forEach(function(item){ 
 
    var key = JSON.stringify(item); 
 
    if (hash[key]) { 
 
     hash[key]++; 
 
    } else { 
 
     hash[key] = 1; 
 
    } 
 
}); 
 
console.log(hash); 
 

 
var hash2 = {}; 
 
arrayOfObjs.forEach(function(item){ 
 
    var key = JSON.stringify(item); 
 
    if (hash2[key]) { 
 
     hash2[key]++; 
 
    } else { 
 
     hash2[key] = 1; 
 
    } 
 
}); 
 
for (key in hash2) { 
 
    val = hash2[key]; 
 
    console.log(key, val); 
 
}

注意,那insted的的hash[key]你可以使用hash[item],你就不會看到它,你期望的方式通過console.log(hash)

+0

我想他想要計算對象而不是密鑰的 –

+0

@RIYAJKHAN,我這樣做了,它只是我的變量的「名稱」,因爲它充當了哈希中的一個關鍵字,我將它們計入其中。請參閱我的編輯,我創建了2例子清楚 – Gavriel

-1

可以遍歷您的數組,並使用JSON.s tringify()將對象轉換爲字符串,然後進行比較。其簡單的hashmap技術可以被使用。

arrayOfObjs = [{1:"h"}, {1:"h"}, {2:"h"}, {3:"ha"}, {4:"haa"}, {4:"haa"}, {4:"haa"}]; 
    var result={} 
    for(var i=0;i<arrayOfObjs.length;i++){ 
     if(!result[JSON.stringify(arrayOfObjs[i])]){ 
     result[JSON.stringify(arrayOfObjs[i])]=1; 
     } else { 
     result[JSON.stringify(arrayOfObjs[i])]=result[JSON.stringify(arrayOfObjs[i])]+1; 
     } 
    } 
    console.log(result); 

https://jsfiddle.net/xv22v72v/

0

你可以嘗試這樣的事情:

var arrayOfObjs = [{1:"h"}, {1:"h"}, {2:"h"}, {3:"ha"}, {4:"haa"}, {4:"haa"}, {4:"haa"}] 
 

 
var result = {}; 
 

 
arrayOfObjs.forEach(function(item){ 
 
    var objStr = JSON.stringify(item); 
 
    result[objStr] = result[objStr]? ++result[objStr]: 1; 
 
}); 
 
console.log(result);

1

我決定使用_.countBy,_.map和_.reduce

arrayOfObjs = [{1:"h"}, {1:"h"}, {2:"h"}, {3:"ha"}, {4:"haa"}, {4:"haa"}, {4:"haa"}]; 

var a = _.countBy(arrayOfObjs, function (obj) { 
    return _.map(obj, function (value, key) { 
    return key + ' ' + value; 
    }); 
}) 

b = _.reduce(a, function (result, value, key) { 
    var splittedKey = key.split(' '); 
    var newObj = {}; 

    newObj[splittedKey[0]] = splittedKey[1]; 

    var newKey = JSON.stringify(newObj) 
    var resultObj = {}; 

    resultObj[newKey] = value; 
    result.push(resultObj) 

    return result; 
}, []); 

console.log(b) 

https://jsfiddle.net/tkv94whe/