Javascript 转换数据

Javascript 转换数据,javascript,underscore.js,Javascript,Underscore.js,我有以下数据结构: const data = [ { name: 'ABC', salesData: [ { timestamp: '2017-09-01', value: 10 }, { timestamp: '2017-09-02', value: 2 } ] }, { name: 'DEF', salesData: [

我有以下数据结构:

const data = [
  {
    name: 'ABC',
    salesData: [
      {
        timestamp: '2017-09-01',
        value: 10
      },
      {
        timestamp: '2017-09-02',
        value: 2
      }
    ]
  },
  {
    name: 'DEF',
    salesData: [
      {
        timestamp: '2017-09-01',
        value: 8
      },
      {
        timestamp: '2017-09-02',
        value: 3
      }
    ]
  }
];
我想将此转换为:

[
  {
    name: 'ABC',
    '2017-09-01': 10,
    '2017-09-02': 2
  },
  {
    name: 'CDE',
    '2017-09-01': 8,
    '2017-09-02': 3
  }
]
我试图使用下划线的链和映射,这让我感到困惑。到目前为止,我有以下内容,不确定如何编写
convertedSalesData
以根据需要进行转换:

_.map(data, function(item) {
    let name = item.name;
    let salesData = item.salesData;
    let convertedSalesData = ?
})

使用ES6,您可以使用扩展语法
来获得此结果

const data=[{“name”:“ABC”,“salesData”:[{“timestamp”:“2017-09-01”,“value”:10},{“timestamp”:“2017-09-02”,“value”:2}}},{“name”:“DEF”,“salesData”:[{“timestamp”:“2017-09-01”,“value”:8},{“timestamp”:“2017-09-02”,“value”:3}]
var result=data.map(函数({name,salesData}){
返回{name,…Object.assign({},…salesData.map(({timestamp,value})=>({[timestamp]:value}))}
})

console.log(result)
对于ES6,您可以使用扩展语法
来获得此结果

const data=[{“name”:“ABC”,“salesData”:[{“timestamp”:“2017-09-01”,“value”:10},{“timestamp”:“2017-09-02”,“value”:2}}},{“name”:“DEF”,“salesData”:[{“timestamp”:“2017-09-01”,“value”:8},{“timestamp”:“2017-09-02”,“value”:3}]
var result=data.map(函数({name,salesData}){
返回{name,…Object.assign({},…salesData.map(({timestamp,value})=>({[timestamp]:value}))}
})
console.log(结果)
const数据=[{
姓名:“ABC”,
销售数据:[{
时间戳:“2017-09-01”,
数值:10
},
{
时间戳:“2017-09-02”,
价值:2
}
]
},
{
名称:“DEF”,
销售数据:[{
时间戳:“2017-09-01”,
数值:8
},
{
时间戳:“2017-09-02”,
价值:3
}
]
}
];
var res=data.map(函数(a){
var obj={
姓名:a.姓名
};
a、 salesData.forEach(函数(x){
obj[x.时间戳]=x.值;
})
返回obj;
})
控制台日志(res)
const数据=[{
姓名:“ABC”,
销售数据:[{
时间戳:“2017-09-01”,
数值:10
},
{
时间戳:“2017-09-02”,
价值:2
}
]
},
{
名称:“DEF”,
销售数据:[{
时间戳:“2017-09-01”,
数值:8
},
{
时间戳:“2017-09-02”,
价值:3
}
]
}
];
var res=data.map(函数(a){
var obj={
姓名:a.姓名
};
a、 salesData.forEach(函数(x){
obj[x.时间戳]=x.值;
})
返回obj;
})

控制台日志(res)类似于@Nenad Vracar。我喜欢使用“reduce”:

data.map(({ name, salesData }) => ({
  name,
  ...salesData.reduce(
    (record, { timestamp, value }) => {
      record[timestamp] = value
      return record
    },
    Object.create(null)
  )
}))

类似于@Nenad Vracar。我喜欢使用“reduce”:

data.map(({ name, salesData }) => ({
  name,
  ...salesData.reduce(
    (record, { timestamp, value }) => {
      record[timestamp] = value
      return record
    },
    Object.create(null)
  )
}))

是否必须使用下划线?请使用[]括号而不是。用于使用日期作为键。@HarshPatel:不太好,我也可以使用纯javascript。是否必须使用下划线?使用[]括号而不是。用于使用日期作为键。@HarshPatel:不太好,我也可以使用普通javascript。我认为我们可以直接使用
{}
而不是
对象。创建(null)
。这与我建议在您只需要一个普通对象来存储k/v对时使用Object.create(null)是一样的。通过这种方式创建的
{}
不会从Object.prototype继承内容。当您在对象上得到things循环时,您将很高兴不编写“hasOwnProperty”。我认为我们可以直接使用
{}
而不是
对象。创建(null)
。这与我建议在您只需要一个普通对象来存储k/v对时使用Object.create(null)是一样的。通过这种方式创建的
{}
不会从Object.prototype继承内容。当你在对象上得到东西循环时,你会很高兴不写“hasOwnProperty”。看起来很完美,使用ES6来实现这个结果是非常棒的。谢谢分享这个技巧。看起来很完美,使用ES6来达到这个效果真是太棒了。谢谢分享这个技巧。