在javascript中计数重复项并获取唯一属性
我有一个对象数组,看起来像这样在javascript中计数重复项并获取唯一属性,javascript,arrays,Javascript,Arrays,我有一个对象数组,看起来像这样 let myArray = [ { id:"1", tool:{ type: 'first', categories: [ { id:'4', name:'Car' } ] } }, { id:"2", tool:{ type: 'second', categories: [
let myArray = [
{
id:"1",
tool:{
type: 'first',
categories: [
{
id:'4',
name:'Car'
}
]
}
},
{
id:"2",
tool:{
type: 'second',
categories: [
{
id:'4',
name:'Car'
},
{
id:'5',
name:'Plane'
}
]
}
}
];
我想拿出一些关于这些类别的数据。所需的结果是一个对象,其中包含具有名称的唯一id,以及该名称出现的次数计数。
大概是这样的:
let categories = {
4: {
name: 'Car',
count: 2
},
5: {
name: 'Plane',
count: 1
},
}
这就是我目前所拥有的
let result = {}
let unique = [...new Set(myArray.map((item) => {
return [...new Set(item.tool.categories.map((item) => {
result[item.id] = (result[item.id] || 0) + 1;
}))];
}))];
这让我
[object Object] {
4: 2,
5: 1
}
我不是一个有经验的javascripter,这些循环中的循环很可能是无效的,所以任何建议都非常受欢迎。
我希望数组最多有1000个对象
/j
问题更新:
如果我希望将输出稍微更改为:
let categories = [
{
id: 4,
name: 'Car',
count: 2
},
{
id: 5,
name: 'Plane',
count: 1
},
]
这就是我到目前为止所做的:
const count = myArray.reduce((count, obj) => {
obj.tool.categories.forEach(({ id, name }) => {
count[id] = count[id] || { count: 0, name, id };
count[id].count++;
});
return count;
}, {});
console.log(count);
使用
Array.prototype.reduce()
和Array.prototype.forEach()
迭代对象,并将类别收集到对象映射中:
const myArray=[{
id:“1”,
工具:{
键入:“第一个”,
类别:[{
id:'4',
名称:“汽车”
}]
}
}, {
id:“2”,
工具:{
键入:“第二个”,
类别:[{
id:'4',
名称:“汽车”
}, {
id:'5',
名称:“飞机”
}]
}
}];
常量计数=myArray.reduce((计数,对象)=>{
obj.tool.categories.forEach(({id,name})=>{
count[id]=count[id]|{count:0,name};
计数[id]。计数++;
});
返回计数;
}, {});
控制台日志(计数)
使用Array.prototype.reduce()
和Array.prototype.forEach()
迭代对象,并将类别收集到对象映射中:
const myArray=[{
id:“1”,
工具:{
键入:“第一个”,
类别:[{
id:'4',
名称:“汽车”
}]
}
}, {
id:“2”,
工具:{
键入:“第二个”,
类别:[{
id:'4',
名称:“汽车”
}, {
id:'5',
名称:“飞机”
}]
}
}];
常量计数=myArray.reduce((计数,对象)=>{
obj.tool.categories.forEach(({id,name})=>{
count[id]=count[id]|{count:0,name};
计数[id]。计数++;
});
返回计数;
}, {});
控制台日志(计数)代码>可以减少原始数组并返回具有正确属性的对象
让myArray=[{
id:“1”,
工具:{
键入:“第一个”,
类别:[{
id:'4',
名称:“汽车”
}]
}
}, {
id:“2”,
工具:{
键入:“第二个”,
类别:[{
id:'4',
名称:“汽车”
}, {
id:'5',
名称:“飞机”
}]
}
}];
让categories=myArray.reduce((a,b)=>{
返回b.tool.categories.forEach((obj)=>{
a?a[obj.id]中的obj.id.计数++:a[obj.id]={count:1,name:obj.name};
}),a;
},{});
log(categories)
您可以减少原始数组并返回具有正确属性的对象
让myArray=[{
id:“1”,
工具:{
键入:“第一个”,
类别:[{
id:'4',
名称:“汽车”
}]
}
}, {
id:“2”,
工具:{
键入:“第二个”,
类别:[{
id:'4',
名称:“汽车”
}, {
id:'5',
名称:“飞机”
}]
}
}];
让categories=myArray.reduce((a,b)=>{
返回b.tool.categories.forEach((obj)=>{
a?a[obj.id]中的obj.id.计数++:a[obj.id]={count:1,name:obj.name};
}),a;
},{});
console.log(categories)
您可以将结果集用作计数对象
让myArray=[{id:“1”,工具:{type:'first',类别:[{id:'4',name:'Car'}]},{id:'2',工具:{type:'second',类别:[{id:'4',name:'Car'},{id:'5',name:'Plane'}]},
类别=myArray.reduce((r,a)=>
(a.tool.categories.forEach(b=>
(r[b.id]=r[b.id]|{name:b.name,count:0}).count++,r),{});
控制台日志(类别)代码>您可以仅使用结果集作为计数对象
让myArray=[{id:“1”,工具:{type:'first',类别:[{id:'4',name:'Car'}]},{id:'2',工具:{type:'second',类别:[{id:'4',name:'Car'},{id:'5',name:'Plane'}]},
类别=myArray.reduce((r,a)=>
(a.tool.categories.forEach(b=>
(r[b.id]=r[b.id]|{name:b.name,count:0}).count++,r),{});
控制台日志(类别)代码>您可以使用Array.prototype.forEach()
让myArray=[
{
id:“1”,
工具:{
键入:“第一个”,
类别:[
{
id:'4',
姓名:'Car'
}
]
}
},
{
id:“2”,
工具:{
键入:“第二个”,
类别:[
{
id:'4',
姓名:'Car'
},
{
id:'5',
名称:“飞机”
}
]
}
}
];
让猫={};
myArray.forEach(({tool:{categories}})=>categories
.forEach(cat=>cat[cat[“id”]]={
[cat[“name”]:cat.name
,计数:(猫[cat[“id”]&&++cats[cat[“id”]]][“count”]|1)
}
)
);
控制台日志(CAT)代码>您可以使用Array.prototype.forEach()
让myArray=[
{
id:“1”,
工具:{
键入:“第一个”,
类别:[
{
id:'4',
姓名:'Car'
}
]
}
},
{
id:“2”,
工具:{
键入:“第二个”,
类别:[
{
id:'4',
姓名:'Car'
},
{
id:'5',
名称:“飞机”
}
]
}
}
];
让猫={};
myArray.forEach(({tool:{categories}})=>categories
.forEach(cat=>cat[cat[“id”]]={
[cat[“name”]:cat.name
,计数:(猫[cat[“id”]&&++cats[cat[“id”]]][“count”]|1)
}
)
);
控制台日志(CAT)代码>请在问题本身中发布您的代码。问题应该是独立的,我们不应该离开现场去审查主要问题。尽管演示非常有用,但它只支持questi中实际存在的内容
myArray.forEach(({tool:{categories}}) => categories
.forEach(cat => cats[cat["id"]] = {
[cat["name"]]:cat.name
, count: (cats[cat["id"]] && ++cats[cat["id"]]["count"] || 1)
}
)
);