Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中计数重复项并获取唯一属性_Javascript_Arrays - Fatal编程技术网

在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)
        }
      )
    );