Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.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_Group By - Fatal编程技术网

Javascript 根据特定字段对对象数组进行分组

Javascript 根据特定字段对对象数组进行分组,javascript,arrays,group-by,Javascript,Arrays,Group By,我有一个对象数组。我想按特定字段对它们进行分组 [ { "name": "JOHN", "type": 1, "sum": 5 }, { "name": "SERA", "type": 1, "sum": 43

我有一个对象数组。我想按特定字段对它们进行分组

[
    {
        "name": "JOHN",
        "type": 1,
        "sum": 5
    },
    {
        "name": "SERA",
        "type": 1,
        "sum": 43
    },
    {
        "name": "SERA",
        "type": 2,
        "sum": 129
    },
    {
        "name": "JOHN",
        "type": 2,
        "sum": 200
    }
]
我希望按名称分组属性的输出如下所示

{
    // Group #1

    "JOHN": [
      {
        "type": 2,
        "sum": 200
      }
      {
        "type": 1,
        "sum": 5
      }
    ],

    // Group #2

    "SERA":[
     {
        "type": 1,
        "sum": 43
     },
     {
        "type": 2,
        "sum": 129
     },
    ]
}

我使用了嵌套循环,但不幸的是,执行速度很慢,并且没有给出正确的结果。

正如您所提到的,我们可以使用对象而不是数组作为最外层的包装器。也可以将一个对象内部交换为一个数组,这是一个可能的解决方案

var data=[{“name”:“JOHN”,“type”:1,“sum”:5},{“name”:“SERA”,“type”:1,“sum”:43},{“name”:“SERA”,“type”:2,“sum”:129},{“name”:“JOHN”,“type”:2,“sum”:200};
var newData={};
data.forEach((项目)=>{
如果(!(newData中的项['name'])){
newData[项目['name']]=[];
}
newData[项目['name']]。推送(
{
“类型”:项[“类型”],
“总和”:项目[“总和”]
}
);
});

console.log(newData)建议的输出结构无效,但是使用可以创建一个对象,其中所有属性都是对象数组:

const数据=[
{
“姓名”:“约翰”,
“类型”:1,
“总和”:5
},
{
“姓名”:“血清”,
“类型”:1,
“总和”:43
},
{
“姓名”:“血清”,
“类型”:2,
“总和”:129
},
{
“姓名”:“约翰”,
“类型”:2,
“总和”:200
}
];
const result=data.reduce((c,{name,type,sum})=>{
c[name]=c[name]| |[];
c[name].push({type,sum});
返回c;
}, {});

控制台日志(结果)
您可以使用此函数,它利用
Array.prototype.reduce
将初始数据转换为另一个数组结构

let数据=[
{
“姓名”:“约翰”,
“类型”:1,
“总和”:5
},
{
“姓名”:“血清”,
“类型”:1,
“总和”:43
},
{
“姓名”:“血清”,
“类型”:2,
“总和”:129
},
{
“姓名”:“约翰”,
“类型”:2,
“总和”:200
}
];
功能分组依据(数据、字段){
让fieldValues=[…数据].reduce((acc,当前)=>{
返回acc.concat(当前[字段]);
},[])。筛选器((值、索引、自身)=>{
返回self.indexOf(value)==索引;
});
让结果=字段值。减少((acc,项目)=>{
let items=[…data].filter(el=>{
返回el.name==项目;
});
items.forEach(i=>delete i.name);
返回Object.assign(acc,{[item]:items});
}, {});
返回结果;
}

log(groupedBy(数据,“名称”)使用
forEach
解构
??
运算符的另一种方式

const merge=(arr)=>{
常量obj={};
arr.forEach(({name,…rest})=>(obj[name]??=[]).push(rest));
返回obj;
};
常数数据=[
{
姓名:“约翰”,
类型:1,
总数:5,
},
{
名称:“血清”,
类型:1,
总数:43,
},
{
名称:“血清”,
类型:2,
总数:129,
},
{
姓名:“约翰”,
类型:2,
总数:200,
},
];

console.log(合并(数据))
输出是否也可以完全包装在
{}
括号中?那么完整的结果是一个对象而不是一个数组?我想不然就不是了possible@Saeed输出不是语法上的correct@caramba是的,它可以完全包装在
{}
括号中。