简体   繁体   English

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

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

How to do it dynamically if we have more objects in input data?如果我们在输入数据中有更多对象,如何动态地做到这一点?

I have dataset array with multiple objects inside it, and objects can be any number.我有数据集数组,里面有多个对象,对象可以是任意数量。 and I have to convert this data into newDataset object with dynamic array inside of it, this array of number dependence on dataset array's objects.我必须将此数据转换为 newDataset object,其中包含动态数组,该数组的数量依赖于数据集数组的对象。 I have done this if we have known number of dataset array's objects.如果我们知道数据集数组对象的数量,我已经这样做了。 for example: see below.例如:见下文。

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

Following seems to work dynamically:以下似乎动态工作:

 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%;}

You could use a Map object您可以使用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; }

Although, you have already taken an answer as accepted, here I've a bit more abstract solution for you.虽然,您已经接受了一个答案,但在这里我为您提供了一个更抽象的解决方案。 Let's say, what if the objects in dataset are not strictly structured?, meaning some of these objects may have properties that you don't want in your newDataset .假设,如果dataset的对象不是严格结构化的怎么办?这意味着其中一些对象可能具有您不希望在newDataset中出现的属性。 This following solution gives you power to filter the properties as you need.以下解决方案使您能够根据需要过滤属性。

 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