简体   繁体   English

如何将对象数组转换为对象,键和值作为数组

[英]How to covert an array of Object into Object with key and value as array

I m looking for optimized solution using reddduced function to covert array of object to an object with values as an array我正在寻找使用 reddduced 函数将对象数组转换为具有数组值的对象的优化解决方案

 const companies=[ {name:'Company One',email:'trishabh885@gmail.com',phone:'8860138213', category:'Finance',start:1981,end:2003,date:'21-06-2009'}, {name:'X Name',email:'grfgr@gmail.com',phone:'8860138213', category:'Finance',start:1981,end:2003,date:'21-06-2009'}, {name:'A one',email:'grfgt@yahoo.com',phone:'943548213', category:'Lecture',start:1981,end:2003,date:'21-06-2009'}, {name:' Name',email:'gtrgt@gmail.com',phone:'9656013653', category:'Finance',start:1981,end:2003}, {name:'Company Name',email:'grgtrgg@gmail.com', category:'Finance',start:1981,end:2003,date:'21-06-2009'}, {name:'sdksdjd',email:'bfbrg@gbmail.com',phone:'7485788475898548', category:'Sciennce',start:1981,end:2003,date:'21-06-2009'}, {name:'kdjfkf',email:'gfggfb@gmail.com',phone:'0959898860138213', category:'Finance',start:1981,end:2003,date:'21-06-2009'}, {name:'vdjf',email:'g5rgf@gmail.com',phone:'050498860138213', category:'Finance',start:1981,end:2003,date:'21-06-2009'}, {name:'vdjvk',email:'trishabh885@gmail.com',phone:'958958860138213', category:'Finance',start:1981,end:2003,date:'21-06-2009'}, {name:'vdkv',email:'trishabh885@gmail.com',phone:'5434886013821543543', category:'Finance',start:1981,end:2003,date:'21-06-2009'}, {name:'zeeshan',email:'trishabh885@gmail.com',phone:'8864535213', category:'Finance',start:1981,end:2003,date:'21-06-2009'} ] // Looking for better and optimised solution to convert array of object into object with. values as an array using map methods let reduced_object={} let reduced_array=companies.reduce((arr,current)=>{ let entries=Object.entries(current) entries.forEach(element=>{ if(reduced_object.hasOwnProperty(element[0])){ reduced_object[element[0]].push(element[1]) }else{ reduced_object[element[0]]=[element[1]]; } }) return reduced_object }) console.log(reduced_array)

This solution does not use reducing:此解决方案不使用减少:

let obj = {
  name: companies.map(item => item.name).filter(value => value !== undefined),
  email: companies.map(item => item.email).filter(value => value !== undefined),
  phone: companies.map(item => item.phone).filter(value => value !== undefined),
  category: companies.map(item => item.category).filter(value => value !== undefined),
  start: companies.map(item => item.start).filter(value => value !== undefined),
  end: companies.map(item => item.end).filter(value => value !== undefined),
  date: companies.map(item => item.date).filter(value => value !== undefined)
}

Edit: Added filters to remove 'undefined' entries when properties are missing in the source.编辑:添加过滤器以在源中缺少属性时删除“未定义”条目。

I would use map instead:我会改用地图:

// ...
const reduced_object = {};
reduced_object.name = companies.map(item => item.name);
reduced_object.email = companies.map(item => item.email);
reduced_object.phone = companies.map(item => item.phone);
// ...

Of course, once you know (or determine) the list of keys of each item, you can wrap it up in a for-of loop:当然,一旦您知道(或确定)了每个项目的键列表,您就可以将其包装在 for-of 循​​环中:

// ...
const reduced_object = {};
for (let key of item_keys) {
    reduced_object[key] = companies.map(item => item[key]);
}

Another solution:另一种解决方案:

 const companies=[ {name:'Company One',email:'trishabh885@gmail.com',phone:'8860138213', category:'Finance',start:1981,end:2003,date:'21-06-2009'}, {name:'X Name',email:'grfgr@gmail.com',phone:'8860138213', category:'Finance',start:1981,end:2003,date:'21-06-2009'}, {name:'A one',email:'grfgt@yahoo.com',phone:'943548213', category:'Lecture',start:1981,end:2003,date:'21-06-2009'}, {name:' Name',email:'gtrgt@gmail.com',phone:'9656013653', category:'Finance',start:1981,end:2003,date:'21-06-2009'}, {name:'Company Name',email:'grgtrgg@gmail.com',phone:'954543656138256', category:'Finance',start:1981,end:2003,date:'21-06-2009'}, {name:'sdksdjd',email:'bfbrg@gbmail.com',phone:'7485788475898548', category:'Sciennce',start:1981,end:2003,date:'21-06-2009'}, {name:'kdjfkf',email:'gfggfb@gmail.com',phone:'0959898860138213', category:'Finance',start:1981,end:2003,date:'21-06-2009'}, {name:'vdjf',email:'g5rgf@gmail.com',phone:'050498860138213', category:'Finance',start:1981,end:2003,date:'21-06-2009'}, {name:'vdjvk',email:'trishabh885@gmail.com',phone:'958958860138213', category:'Finance',start:1981,end:2003,date:'21-06-2009'}, {name:'vdkv',email:'trishabh885@gmail.com',phone:'5434886013821543543', category:'Finance',start:1981,end:2003,date:'21-06-2009'}, {name:'zeeshan',email:'trishabh885@gmail.com',phone:'8864535213', category:'Finance',start:1981,end:2003,date:'21-06-2009'} ] const arr = companies.reduce((acc, company) => ({ ...acc, ...Object.entries(company).reduce((objAcc, [key, val]) => ({ ...objAcc, [key]: [...acc?.[key] ?? [], ...val ? [val] : []] }), {}) }), {}) console.log(arr)

If you don't want to have duplicate values you can also do this:如果你不想有重复的值,你也可以这样做:

 const companies=[ {name:'Company One',email:'trishabh885@gmail.com',phone:'8860138213', category:'Finance',start:1981,end:2003,date:'21-06-2009'}, {name:'X Name',email:'grfgr@gmail.com',phone:'8860138213', category:'Finance',start:1981,end:2003,date:'21-06-2009'}, {name:'A one',email:'grfgt@yahoo.com',phone:'943548213', category:'Lecture',start:1981,end:2003,date:'21-06-2009'}, {name:' Name',email:'gtrgt@gmail.com',phone:'9656013653', category:'Finance',start:1981,end:2003,date:'21-06-2009'}, {name:'Company Name',email:'grgtrgg@gmail.com',phone:'954543656138256', category:'Finance',start:1981,end:2003,date:'21-06-2009'}, {name:'sdksdjd',email:'bfbrg@gbmail.com',phone:'7485788475898548', category:'Sciennce',start:1981,end:2003,date:'21-06-2009'}, {name:'kdjfkf',email:'gfggfb@gmail.com',phone:'0959898860138213', category:'Finance',start:1981,end:2003,date:'21-06-2009'}, {name:'vdjf',email:'g5rgf@gmail.com',phone:'050498860138213', category:'Finance',start:1981,end:2003,date:'21-06-2009'}, {name:'vdjvk',email:'trishabh885@gmail.com',phone:'958958860138213', category:'Finance',start:1981,end:2003,date:'21-06-2009'}, {name:'vdkv',email:'trishabh885@gmail.com',phone:'5434886013821543543', category:'Finance',start:1981,end:2003,date:'21-06-2009'}, {name:'zeeshan',email:'trishabh885@gmail.com',phone:'8864535213', category:'Finance',start:1981,end:2003,date:'21-06-2009'} ] const arr = companies.reduce((acc, company) => ({ ...acc, ...Object.entries(company).reduce((objAcc, [key, val]) => ({ ...objAcc, [key]: [...new Set([...acc?.[key] ?? [], ...val ? [val] : []])] }), {}) }), {}) console.log(arr)

The fun functional route:有趣的功能路线:

[...new Set(companies.flatMap(Object.keys))]
    .reduce((result, key) => {result[key] = companies.map(c => c[key]); return result;}, {})

The first line finds all the keys.第一行找到所有的键。 The second line creates the desired result.第二行创建所需的结果。 But honestly, in real life, I would skip that reduce and write a simple for loop.但老实说,在现实生活中,我会跳过那个 reduce 并编写一个简单的 for 循环。 I would always pick clarity over "functional purity".我总是会选择清晰度而不是“功能纯度”。

With simple forEach loops, iterate and check for each item.使用简单的forEach循环,迭代并检查每个项目。

 const process = (arr, output = {}) => { companies.forEach((obj) => Object.entries(obj).forEach(([key, value]) => (output[key] ||= []).push(value) ) ); return output; }; const companies=[ {name:'Company One',email:'trishabh885@gmail.com',phone:'8860138213', category:'Finance',start:1981,end:2003,date:'21-06-2009'}, {name:'X Name',email:'grfgr@gmail.com',phone:'8860138213', category:'Finance',start:1981,end:2003,date:'21-06-2009'}, {name:'A one',email:'grfgt@yahoo.com',phone:'943548213', category:'Lecture',start:1981,end:2003,date:'21-06-2009'}, {name:' Name',email:'gtrgt@gmail.com',phone:'9656013653', category:'Finance',start:1981,end:2003}, {name:'Company Name',email:'grgtrgg@gmail.com', category:'Finance',start:1981,end:2003,date:'21-06-2009'}, {name:'sdksdjd',email:'bfbrg@gbmail.com',phone:'7485788475898548', category:'Sciennce',start:1981,end:2003,date:'21-06-2009'}, {name:'kdjfkf',email:'gfggfb@gmail.com',phone:'0959898860138213', category:'Finance',start:1981,end:2003,date:'21-06-2009'}, {name:'vdjf',email:'g5rgf@gmail.com',phone:'050498860138213', category:'Finance',start:1981,end:2003,date:'21-06-2009'}, {name:'vdjvk',email:'trishabh885@gmail.com',phone:'958958860138213', category:'Finance',start:1981,end:2003,date:'21-06-2009'}, {name:'vdkv',email:'trishabh885@gmail.com',phone:'5434886013821543543', category:'Finance',start:1981,end:2003,date:'21-06-2009'}, {name:'zeeshan',email:'trishabh885@gmail.com',phone:'8864535213', category:'Finance',start:1981,end:2003,date:'21-06-2009'} ] console.log(process(companies))

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

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