代码之家  ›  专栏  ›  技术社区  ›  Tushar Walzade

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

  •  -1
  • Tushar Walzade  · 技术社区  · 9 年前

    最初,我有一个数组:

    [{
        "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"
    }]
    

    我希望文件名在一个数组中,没有重复的记录。因此,我希望输出类似于以下内容:

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

    2 回复  |  直到 9 年前
        1
  •  3
  •   Wainage    9 年前
    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]);
    
        2
  •  1
  •   Hassan Imam Ravi kant    9 年前

    您可以使用 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; }
    推荐文章