2017-07-07 128 views
1

我有一个数组:JS:组阵列由值嵌套数组

[ 
    { 
    theme: "low battery", 
    Number: "S-10", 
    components: [ "hardware", "battery" ] 
    }, 
    { 
    theme: "bad sync", 
    Number: "S-11", 
    components: [ "software" ] 
    }, 
    { 
    theme: "misc troubles", 
    Number: "S-12", 
    components: [ "hardware", "software" ] 
    } 
] 

所以想要组这个数组由“组件”的值。换句话说,我想知道,组件在数组中发生了多少次。例如:

[ 
    { 
    component: "hardware", 
    amount: 2 
    }, 
    { 
    component: "software", 
    amount: 2 
    }, 
    {  
    component: "battery", 
    amount: 1 
    } 
] 
+1

的可能的复制[什么是GROUPBY对象的JavaScript的阵列上的最有效的方法?(https://stackoverflow.com/questions/14446511/what-is-the最有效的方法到对象上的一个javascript对象数组) – Andreas

回答

1

可以创建地图来存储每个组件的计以有效的方式(查找O(1)的复杂性):

var items = [ 
 
    { 
 
    theme: "low battery", 
 
    Number: "S-10", 
 
    components: [ "hardware", "battery" ] 
 
    }, 
 
    { 
 
    theme: "bad sync", 
 
    Number: "S-11", 
 
    components: [ "software" ] 
 
    }, 
 
    { 
 
    theme: "misc troubles", 
 
    Number: "S-12", 
 
    components: [ "hardware", "software" ] 
 
    } 
 
]; 
 

 
var componentMap = new Map(); 
 

 
items.forEach((item) => { 
 
    item.components.forEach((component) => { 
 
    if (componentMap.has(component)) { 
 
     componentMap.set(component, componentMap.get(component) + 1); 
 
    } 
 
    else { 
 
     componentMap.set(component, 1); 
 
    } 
 
    }); 
 
}); 
 

 
var componentCount = []; 
 

 
componentMap.forEach((value, key) => { 
 
    componentCount.push({ 
 
    component: key, 
 
    amount: value 
 
    }); 
 
}); 
 

 
console.log(componentCount);

1


 

 
var arr = [ 
 
     { 
 
     theme: "low battery", 
 
     Number: "S-10", 
 
     components: [ "hardware", "battery" ] 
 
     }, 
 
     { 
 
     theme: "bad sync", 
 
     Number: "S-11", 
 
     components: [ "software" ] 
 
     }, 
 
     { 
 
     theme: "misc troubles", 
 
     Number: "S-12", 
 
     components: [ "hardware", "software" ] 
 
     } 
 
    ]; 
 
    var components = {}; 
 
    arr.forEach(function(val){ 
 
     val.components.forEach(function(c){ 
 
      components[c] = !(c in components) ? 1 : Number(components[c])+1; 
 
     }); 
 
    }); 
 

 
    var componentCount = []; 
 
    for(key in components){ 
 
    componentCount.push({'component' : key, 'amount' : components[key]}); 
 
    } 
 
    
 
    console.log(componentCount);

+0

这正是我需要的。非常感谢。 –

+0

@DenisovJr。考虑接受答案,如果有帮助。干杯! – Dij

1

您可以使用forEach()循环和thisArg参数来存储每个组件和增量。

var data = [{"theme":"low battery","Number":"S-10","components":["hardware","battery"]},{"theme":"bad sync","Number":"S-11","components":["software"]},{"theme":"misc troubles","Number":"S-12","components":["hardware","software"]}] 
 

 
var result = [] 
 

 
data.forEach(function(e) { 
 
    var that = this; 
 
    e.components.forEach(function(c) { 
 
    if(!that[c]) { 
 
     that[c] = {component: c, amount: 0} 
 
     result.push(that[c]) 
 
    } 
 
    that[c].amount += 1 
 
    }) 
 
}, {}) 
 

 
console.log(result)