Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
281 views
in Technique[技术] by (71.8m points)

javascript - 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

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)
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]);

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...