Javascript 按键对数组进行分组,并在每次迭代中创建一个相关键的数组

Javascript 按键对数组进行分组,并在每次迭代中创建一个相关键的数组,javascript,Javascript,给定一个对象数组 const data = [ { id: 1, documentation_id: 4, document_id: 'nil', category_id: 1, created_at: "2020-03-29T11:06:44.000Z", updated_at: "2020-03-29T11:06:44.000Z" }, { id: 11, documentation_id: 10, document_id:

给定一个对象数组

const data = [ 
  { id: 1,
    documentation_id: 4,
    document_id: 'nil',
    category_id: 1,
    created_at: "2020-03-29T11:06:44.000Z",
    updated_at: "2020-03-29T11:06:44.000Z" },
  { id: 11,
    documentation_id: 10,
    document_id: 'nil',
    category_id: 1,
    created_at: "2020-03-29T11:06:44.000Z",
    updated_at: "2020-03-29T11:06:44.000Z" },
  { id: 2,
    documentation_id: 5,
    document_id: '1',
    category_id: 2,
    created_at: "2020-03-29T11:06:44.000Z",
    updated_at: "2020-03-29T11:06:44.000Z" },
  { id: 100,
    documentation_id: 15,
    document_id: '10',
    category_id: 2,
    created_at: "2020-03-29T11:06:44.000Z",
    updated_at: "2020-03-29T11:06:44.000Z" },
  { id: 3,
    documentation_id: 5,
    document_id: '3',
    category_id: 3,
    created_at: "2020-03-29T11:06:44.000Z",
    updated_at: "2020-03-29T11:06:44.000Z" },
  { id: 4,
    documentation_id: 6,
    document_id: '1',
    category_id: 4,
    created_at: "2020-03-29T11:06:44.000Z",
    updated_at: "2020-03-29T11:06:44.000Z" },
  { id: 5,
    documentation_id: 6,
    document_id: '3',
    category_id: 5,
    created_at: "2020-03-29T11:06:44.000Z",
    updated_at: "2020-03-29T11:06:44.000Z" },
  { id: 6,
    documentation_id: 6,
    document_id: '5',
    category_id: 1,
    created_at: "2020-03-29T11:06:44.000Z",
    updated_at: "2020-03-29T11:06:44.000Z" 
  },
  { id: 7,
    documentation_id: 7,
    document_id: '1',
    category_id: 6,
    created_at: "2020-03-29T11:06:44.000Z",
    updated_at: "2020-03-29T11:06:44.000Z"}]
我希望能够通过category_id进行分组,结果如下所示

const data = [{
    category_id: 1,
    documentation: [{
        document_id: "nil",
        documentation_id: 4
    }, {
        document_id: "nil",
        documentation_id: 10
    }, {
        document_id: "5",
        documentation_id: 6
    }]
}, {
    category_id: 2,
    documentation: [{
        document_id: "1",
        documentation_id: 5
    }, {
        document_id: "10",
        documentation_id: 15
    }]
}, {
    category_id: 3,
    documentation: [{
        document_id: "3",
        documentation_id: 5
    }]
}, {
    category_id: 4,
    documentation: [{
        document_id: "1",
        documentation_id: 6
    }]
}, {
    category_id: 5,
    documentation: [{
        document_id: "3",
        documentation_id: 6
    }]
}, {
    category_id: 6,
    documentation: [{
        document_id: "1",
        documentation_id: 7
    }]
}]
如果类别存在不止一次,请创建文档数组并将该类别中的文档推送到数组中。如果该类别只存在一次,则将该类别的唯一文档推送到数组中

这是我提出的低效解决方案。我想优化解决方案

function groupDocumentationByCategory(data) {
    const result = [];
    const formattedArray = data.slice(0);
    const seen = [];
    for (let k = 0; k < data.length; k++) {
        if (seen.indexOf(data[k].category_id) < 0) {
            seen.push(data[k].category_id);
            formattedArray[k].documentation = [];
            for (let j = 0; j < formattedArray.length; j++) {
                if (data[k].category_id === data[j].category_id) {
                    formattedArray[k].documentation.push({
                        document_id: formattedArray[j].document_id,
                        documentation_id: formattedArray[j].documentation_id,
                    });
                    delete data[k].documentation_id;
                    delete data[k].document_id;
                    delete data[k].created_at;
                    delete data[k].updated_at;
                }
            }
            result.push(data[k]);
        }
    }
    return result;
}
功能组文档按类别(数据){
常量结果=[];
const formattedArray=data.slice(0);
const seen=[];
for(设k=0;k
迭代数组并构造一个对象,该对象由
类别id
索引。第一次找到
category\u id
时,创建
id
category\u id
属性,并将
documentation
属性初始化为空数组。然后推到那个数组。最后,获取对象的值:

const data=[{id:1,文档id:4,文档id:“nil”,类别id:1,创建地点:“2020-03-29T11:06:44.000Z”,更新地点:“2020-03-29T11:06:44.000Z”},{id:11,文档id:10,文档id:“nil”,类别id:1,创建地点:“2020-03-29T11:06:44.000Z”,更新地点:“2020-03-29T11:06:44.000Z”,更新地点:“2020-03-29T11:06:44.000Z”,文档id:5,{,类别id:2,创建地址:“2020-03-29T11:06:44.000Z”,更新地址:“2020-03-29T11:06:44.000Z”},{id:100,文档id:15,文档id:10,类别id:2,创建地址:“2020-03-29T11:06:44.000Z”,更新地址:“2020-03-29T11:06:44.000Z”},{id:3,文档id:5,文档id:3,文档id:3,类别id:3,创建地址:“2020-03-29T11:06:44.000Z”,更新地址:“2020-03-03:06:44.000Z”“2020-03-29T11:06:44.000Z”{id:4,文档id:6,文档id:“1”,类别id:4,创建地址:“2020-03-29T11:06:44.000Z”,更新地址:“2020-03-29T11:06:44.000Z”},{id:5,文档id:6,文档id:“3”,类别id:5,创建地址:“2020-03-29T11:06:44.000Z”,更新地址:“2020-03-29T11:06:44.000Z”,文档id:6,文档id:,类别id:1,创建地址:“2020-03-29T11:06:44.000Z”,更新地址:“2020-03-29T11:06:44.000Z”},{id:7,文档id:7,文档id:1,类别id:6,创建地址:“2020-03-29T11:06:44.000Z”,更新地址:“2020-03-29T11:06:44.000Z”};
const dataByCategory={};
用于(数据的常量{id、类别{id、文档{id}){
如果(!dataByCategory[类别id]){
dataByCategory[类别id]={
身份证件
类别识别码,
文件:[]
};
}
dataByCategory[category_id].documentation.push({document_id,documentation_id});
}

log(Object.values(dataByCategory))
迭代数组并构造一个对象,该对象由
category\u id
索引。第一次找到
category\u id
时,创建
id
category\u id
属性,并将
documentation
属性初始化为空数组。然后推到那个数组。最后,获取对象的值:

const data=[{id:1,文档id:4,文档id:“nil”,类别id:1,创建地点:“2020-03-29T11:06:44.000Z”,更新地点:“2020-03-29T11:06:44.000Z”},{id:11,文档id:10,文档id:“nil”,类别id:1,创建地点:“2020-03-29T11:06:44.000Z”,更新地点:“2020-03-29T11:06:44.000Z”,更新地点:“2020-03-29T11:06:44.000Z”,文档id:5,{,类别id:2,创建地址:“2020-03-29T11:06:44.000Z”,更新地址:“2020-03-29T11:06:44.000Z”},{id:100,文档id:15,文档id:10,类别id:2,创建地址:“2020-03-29T11:06:44.000Z”,更新地址:“2020-03-29T11:06:44.000Z”},{id:3,文档id:5,文档id:3,文档id:3,类别id:3,创建地址:“2020-03-29T11:06:44.000Z”,更新地址:“2020-03-03:06:44.000Z”“2020-03-29T11:06:44.000Z”{id:4,文档id:6,文档id:“1”,类别id:4,创建地址:“2020-03-29T11:06:44.000Z”,更新地址:“2020-03-29T11:06:44.000Z”},{id:5,文档id:6,文档id:“3”,类别id:5,创建地址:“2020-03-29T11:06:44.000Z”,更新地址:“2020-03-29T11:06:44.000Z”,文档id:6,文档id:,类别id:1,创建地址:“2020-03-29T11:06:44.000Z”,更新地址:“2020-03-29T11:06:44.000Z”},{id:7,文档id:7,文档id:1,类别id:6,创建地址:“2020-03-29T11:06:44.000Z”,更新地址:“2020-03-29T11:06:44.000Z”};
const dataByCategory={};
用于(数据的常量{id、类别{id、文档{id}){
如果(!dataByCategory[类别id]){
dataByCategory[类别id]={
身份证件
类别识别码,
文件:[]
};
}
dataByCategory[category_id].documentation.push({document_id,documentation_id});
}

log(Object.values(dataByCategory))
您可以使用
Array.prototype.reduce
结合一些
Array.prototype.map
来实现结果

也许会有帮助

var数据=[{
id:1,
文件编号:4,
文件编号:“无”,
类别识别号:1,
创建于:“2020-03-29T11:06:44.000Z”,
更新地址:“2020-03-29T11:06:44.000Z”
},
{
id:11,
文件编号:10,
文件编号:“无”,
类别识别号:1,
创建于:“2020-03-29T11:06:44.000Z”,
更新地址:“2020-03-29T11:06:44.000Z”
},
{
id:2,
文件编号:5,
文件编号:“1”,
类别