如何DRY映射功能?

How to DRY mapping function?

我有以下数据:

var jsonData = {
  "data": [
    {
      "id": 1,
      "name": "London",
      "date": "2018-04-20",
      "temp": 15,
      "rain": 2,
      "wind": 50,
      "humidity" : 80,
    }
  ]
}; 

这是我目前编码的映射部分:

var mainContainer = {
  temp : jsonData.data.map (a => a.temp), 
  rain : jsonData.data.map (a => a.rain),        // jsonData.data.map (a => ) being repeated
  wind : jsonData.data.map (a => a.wind),        // jsonData.data.map (a => ) being repeated
  humidity: jsonData.data.map (a => a.humidity)  // jsonData.data.map (a => ) being repeated
};

console.log(mainContainer);

有什么方法可以DRY代码,让我不重复映射函数?唯一的区别在于 属性 名称和映射部分。

创建一个包含 属性 个要映射的名称的数组

var props = ["temp", "rain", "wind", "humidity" ];

现在使用 reduce

迭代此 props
var mainContainer = props.reduce( (a,c) => {
   a[c] = jsonData.data.map (s => s[c]);
   return a;
}, {});

您可以循环到 data 数组,并通过检查 属性 是否已经存在来相应地创建一个新对象。

var jsonData = {
  "data": [
    {
      "id": 1,
      "name": "London",
      "date": "2018-04-20",
      "temp": 15,
      "rain": 2,
      "wind": 50,
      "humidity" : 80,
    },
    {
      "id": 1,
      "name": "London",
      "date": "2018-04-20",
      "temp": 25,
      "rain": 22,
      "wind": 40,
      "humidity" : 60,
    }
  ]
}; 

var res = {};
jsonData.data.forEach((obj)=>{
   if(res.temp){
     res.temp.push(obj.temp);
   } else {
     res.temp = [obj.temp];
   }
   if(res.rain){
     res.rain.push(obj.rain);
   } else {
     res.rain = [obj.rain];
   }
   if(res.wind){
     res.wind.push(obj.wind);
   } else {
     res.wind = [obj.wind];
   }
   if(res.humidity){
     res.humidity.push(obj.humidity);
   } else {
     res.humidity = [obj.humidity];
   }
});

console.log(res);