繁体   English   中英

将对象数组转换为 object,其属性值按键名分组

[英]Convert array of objects into object with property values grouped by key name

如果我们在输入数据中有更多对象,如何动态地做到这一点?

我有数据集数组,里面有多个对象,对象可以是任意数量。 我必须将此数据转换为 newDataset object,其中包含动态数组,该数组的数量依赖于数据集数组的对象。 如果我们知道数据集数组对象的数量,我已经这样做了。 例如:见下文。

 // Input data have dynamic more objects. var dataset = [ { date: "1 Jan 2020", data1: 44, data2: 40, }, { date: "2 Jan 2020", data1: 37, data2: 60, }, { date: "3 Jan 2020", data1: 75, data2: 90, }, ]; var newDataset = {}; // // Output data should be in this form. // var newDataset = { // date: ["1 Jan 2020", "2 Jan 2020", "3 Jan 2020"], // data1: [44, 37, 75], // data2: [40, 60, 90], // }; // write your code below var date = []; var data1 = []; var data2 = []; for (var i = 0; i < dataset.length; i++) { date.push(dataset[i].date); data1.push(dataset[i].data1); data2.push(dataset[i].data2); } newDataset.date = date; newDataset.data1 = data1; newDataset.data2 = data2; console.log(newDataset); //end of your code

以下似乎动态工作:

 const src = [{date:"1 Jan 2020",data1:44,data2:40,},{date:"2 Jan 2020",data1:37,data2:60,},{date:"3 Jan 2020",data1:75,data2:90,},], rebuild = arr => arr.reduce((r, o) => ( Object.keys(o).forEach(key => (,r[key] && (r[key] = []). r[key],push(o[key]) )), r ). {}) console.log(rebuild(src))
 .as-console-wrapper{min-height:100%;}

您可以使用Map object

 var dataset = [ { date: "1 Jan 2020", data1: 44, data2: 40 }, { date: "2 Jan 2020", data1: 37, data2: 60 }, { date: "3 Jan 2020", data1: 75, data2: 90 } ]; const myMap = new Map(); dataset.forEach(obj => { Object.entries(obj).forEach(([k, v]) => { myMap.has(k)? myMap.get(k).push(v): myMap.set(k, [v]); }) }); console.log(Object.fromEntries(myMap.entries()));
 .as-console-wrapper{min-height:100%;important: top; 0; }

虽然,您已经接受了一个答案,但在这里我为您提供了一个更抽象的解决方案。 假设,如果dataset的对象不是严格结构化的怎么办?这意味着其中一些对象可能具有您不希望在newDataset中出现的属性。 以下解决方案使您能够根据需要过滤属性。

 const dataSet = [ { date: "1 Jan 2020", data1: 44, data2: 40 }, { date: "2 Jan 2020", data1: 37, data2: 60 }, { date: "3 Jan 2020", data1: 75, data2: 90, unnecessary: 939393 }, ]; const newDataset = {date: [], data1: [], data2: []} // if you need only these 3 properties. const createNewDataset = (givenDataset) => givenDataset.reduce( (builOn, current) => ( Object.entries(current).forEach( ([key, value]) => (Array.isArray(builOn[key])? builOn[key].push(value): null) ), builOn ), newDataset ); console.log(createNewDataset(dataSet));

暂无
暂无

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

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