2016-07-29 45 views
0

內算兩個不同的變量的元素組合的出現我有一個看起來格式的Javascript代碼對象

[ 
    {name: "a", class: "AA"}, 
    {name: "b", class: "BB"}, 
    {name: "xx", class: "XY"}, 
    {name: "a", class: "AA"}, 
    {name: "b", class: "BB"} 
]; 

我試圖減少這種計算唯一名稱的組合的出現和數據類值如下

name:"a", class:"AA", count: 2, 
name:"b", class: "BB", count: 2, 
name:"xx", class:"XY", count:1 

我怎麼能在Javascript中減少一個變量的元素做到這一點是我很熟悉,但有兩個不同變量的組合是我需要幫助。對不起,如果這對你們中的一些人來說似乎很基本

謝謝

回答

0

您可以forEach環和可選thisArg參數做到這一點。

var data = [{name:"a", class: "AA"}, {name:"b", class: "BB"}, {name:"xx", class: "XY"}, {name:"a", class:"AA"}, {name: "b", class:"BB"}]; 
 

 
var result = []; 
 
data.forEach(function(e) { 
 
    if(!this[e.name+'|'+e.class]) { 
 
    this[e.name+'|'+e.class] = {name: e.name, class: e.class, count: 0} 
 
    result.push(this[e.name+'|'+e.class]); 
 
    } 
 
    this[e.name+'|'+e.class].count++; 
 
}); 
 

 
console.log(result);

1

一個這樣做是迭代的數據陣列上並連接每個對象的名稱和類屬性的方式,然後使用這個作爲一個計數器對象的關鍵,增加每個鍵的值。

var data = [{name:"a", class: "AA"}, {name:"b", class: "BB"}, {name:"xx", class: "XY"}, {name:"a", class:"AA"}, {name: "b", class:"BB"}]; 
var counter = {}; 
for (let obj of data) { 
    let key = `${obj.name}${obj.class}`; 
    if (counter[key] === undefined) { 
     counter[key] = 0; 
    } 
    counter[key]++; 
} 
console.log(counter); 

請記住,示例代碼使用功能從es6

0

你可以這樣說:

var input = [ 
 
    {name: "a", class: "AA"}, 
 
    {name: "b", class: "BB"}, 
 
    {name: "xx", class: "XY"}, 
 
    {name: "a", class: "AA"}, 
 
    {name: "b", class: "BB"} 
 
]; 
 

 
var output = {}; 
 
input.forEach(function(element) { 
 
    output[element.name] = output[element.name] || {}; 
 
    output[element.name][element.class] = output[element.name][element.class] || 0; 
 
    ++output[element.name][element.class]; 
 
}); 
 

 
console.log(output);

0

只要在你的榜樣你的對象都在有序的喜歡,你可以使用JSON.stringify()將它們轉換到一個字符串。使用這些字符串作爲對象的鍵,並使用該對象來計算每個鍵的外觀。

優點:工作的每一個對象,無論是性能

缺點:你必須確保屬性都以相同的順序

這裏有一個的jsfiddle: https://jsfiddle.net/jgn2matg/

0
data = [] // your array here 

data.reduce((result, value) => { 
    const resultValue = result.find(resultItem => resultItem.name === value.name && resultItem.class === value.class); 

    resultValue ? resultValue.count++ : result.push(Object.assign(value, {count: 1})); 

    return result; 
}, []);