JS:组阵列由值嵌套数组
问题描述:
我有一个数组: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
}
]
答
可以创建地图来存储每个组件的计以有效的方式(查找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);
答
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
答
您可以使用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)
的可能的复制[什么是GROUPBY对象的JavaScript的阵列上的最有效的方法?(https://*.com/questions/14446511/what-is-the最有效的方法到对象上的一个javascript对象数组) – Andreas