简体   繁体   English

通过多个键将数组中的对象分组

[英]Grouping objects in an array by multiple keys

Initially, I've this array: 最初,我有这个数组:

[{
    "vendorid": 1,
    "vendorname": "Vendor1",
    "maxfilelimit": 2,
    "uploadfilename": "Voice1.xlsx"
},
{
    "vendorid": 1,
    "vendorname": "Vendor1",
    "maxfilelimit": 2,
    "uploadfilename": "Ven1_Voice.xlsx"
},
{
    "vendorid": 2,
    "vendorname": "Vendor2",
    "maxfilelimit": 2,
    "uploadfilename": "Voice2.xlsx"
},
{
    "vendorid": 2,
    "vendorname": "Vendor2",
    "maxfilelimit": 2,
    "uploadfilename": "Ven2_Voice.xlsx"
}]

I want the file names in an array with no repetition of records. 我想要一个没有重复记录的数组中的文件名。 So, I expect the output similar to following: 因此,我期望输出类似于以下内容:

[{
    "vendorid": 1,
    "vendorname": "Vendor1",
    "maxfilelimit": 2,
    "uploadfilename": ["Voice1.xlsx", "Ven1_Voice.xlsx"]
}, {
    "vendorid": 2,
    "vendorname": "Vendor2",
    "maxfilelimit": 2,
    "uploadfilename": ["Voice2.xlsx", "Ven2_Voice.xlsx"]
}]

I found some solutions like d3.js, alaSQL but not getting output as expected 我找到了一些解决方案,例如d3.js,alaSQL,但未获得预期的输出

var data = [{
    "vendorid": 1,
    "vendorname": "Vendor1",
    "maxfilelimit": 2,
    "uploadfilename": "Voice1.xlsx"
},
{
    "vendorid": 1,
    "vendorname": "Vendor1",
    "maxfilelimit": 2,
    "uploadfilename": "Ven1_Voice.xlsx"
},
{
    "vendorid": 2,
    "vendorname": "Vendor2",
    "maxfilelimit": 2,
    "uploadfilename": "Voice2.xlsx"
},
{
    "vendorid": 2,
    "vendorname": "Vendor2",
    "maxfilelimit": 2,
    "uploadfilename": "Ven2_Voice.xlsx"
}];
;
// create lookup table
let lookup = data.reduce((p, v) => {
    // seen me yet?
    if (p[v.vendorid]) {
    p[v.vendorid].uploadfilename.push(v.uploadfilename); 
  } else {
    // nope ... first time
    p[v.vendorid] = v;
    // create array of filenames
    p[v.vendorid].uploadfilename = [v.uploadfilename];
  }
  return p;
}, {});

// convert back to array
Object.keys(lookup).map(key => lookup[key]);

You can use array#reduce and inside it you can store your result in an object and then extract values using Object.values() . 您可以使用array#reduce并且可以在其中将结果存储在一个对象中,然后使用Object.values()提取值。

 var data = [{"vendorid": 1,"vendorname": "Vendor1","maxfilelimit": 2,"uploadfilename": "Voice1.xlsx"},{"vendorid": 1,"vendorname": "Vendor1","maxfilelimit": 2,"uploadfilename": "Ven1_Voice.xlsx"},{"vendorid": 2,"vendorname": "Vendor2","maxfilelimit": 2,"uploadfilename": "Voice2.xlsx"},{"vendorid": 2,"vendorname": "Vendor2","maxfilelimit": 2,"uploadfilename": "Ven2_Voice.xlsx"}]; var result = data.reduce((hash, obj) => { let key = obj.vendorid+'|' +obj.vendorname+'|' +obj.maxfilelimit; if(hash[key]) hash[key].uploadfilename.push(obj.uploadfilename); else { hash[key] = obj; hash[key].uploadfilename = [obj.uploadfilename]; } return hash; },{}); console.log(Object.values(result)); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM