![](/img/trans.png)
[英]Convert an object with key values to an array of objects with said key name and values
[英]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.