首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将数组对象扁平为单个对象- Javascript

将数组对象扁平为单个对象- Javascript
EN

Stack Overflow用户
提问于 2018-08-09 10:54:43
回答 5查看 66关注 0票数 0

我使用ChartKick来表示多个系列线图中的一些数据。所需格式如下:

代码语言:javascript
复制
let data = [
   { name: 'sharry', data: { '2008-08-02': 10006097, '2018-08-03': 10670, etc }},
   { name: 'stuart', data: { '2018-08-01' :1401231321, '2018-08-04': 2500000000, etc }}
];

我从数据库获得的数据是:

代码语言:javascript
复制
let user_usage = [
  { "name":"stuart", "data": { "2018-08-02":10006097 } },
  { "name":"stuart", "data": { "2018-08-03":10670 } },
  { "name":"stuart", "data": { "2018-08-05":5800000 } },
  { "name":"stuart", "data": { "2018-08-07":10789000 } },
  { "name":"stuart", "data": { "2018-08-08":1033000000 } },
  { "name":"sharry", "data": { "2018-08-01":1401231321 } },
  { "name":"sharry", "data": { "2018-08-04":2500000000 } }
];

我已经尝试了2天,使数据库响应以上述所需的格式,任何帮助,非常感谢的人。这是我到目前为止所拥有的。我使用的是Ramda,但是ES6可以使用:

代码语言:javascript
复制
let chartdata = [];
let u = R.groupBy(R.prop('name'))(user_usage);

Object.keys(u).forEach((name, index) => {
  chartdata.push({ name , data: {} });
  let usage = u[name];

  Object.keys(usage).forEach(row => {
    let data = usage[row].data;
    let date = Object.keys(data)[0];
    let total = data[Object.keys(data)[0]];
    chartdata[index].data = Object.assign({}, {`${date}: ${total}`};
  });
});
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-08-09 10:58:55

Array.reduce()Object.assign()一起使用,以便可以将data对象分配给累加器的现有项。

代码语言:javascript
复制
let user_usage = [
  { "name":"stuart", "data": { "2018-08-02":10006097 } },
  { "name":"stuart", "data": { "2018-08-03":10670 } },
  { "name":"stuart", "data": { "2018-08-05":5800000 } },
  { "name":"stuart", "data": { "2018-08-07":10789000 } },
  { "name":"stuart", "data": { "2018-08-08":1033000000 } },
  { "name":"sharry", "data": { "2018-08-01":1401231321 } },
  { "name":"sharry", "data": { "2018-08-04":2500000000 } }
];
var res = user_usage.reduce((acc, item) => {
  var existItem = acc.find(({name}) => name === item.name);
  if(existItem){
    Object.assign(existItem.data,item.data);
  } else {
    acc.push(item);
  }
  return acc;
}, 
[]);
console.log(res);

票数 2
EN

Stack Overflow用户

发布于 2018-08-09 11:01:56

代码语言:javascript
复制
var obj = {};
user_usage.forEach(function(e){
    if(!obj[e.name]){
       obj[e.name] = e.data;
    } else {
       obj[e.name] = Object.assign(obj[e.name], e.data)
    }
});
var array = Object.keys(obj).map(function(e){return {name: e, data: obj[e]}})
票数 1
EN

Stack Overflow用户

发布于 2018-08-09 11:00:18

你可以这样做:

代码语言:javascript
复制
let user_usage = [
  { "name":"stuart", "data": { "2018-08-02":10006097 } },
  { "name":"stuart", "data": { "2018-08-03":10670 } },
  { "name":"stuart", "data": { "2018-08-05":5800000 } },
  { "name":"stuart", "data": { "2018-08-07":10789000 } },
  { "name":"stuart", "data": { "2018-08-08":1033000000 } },
  { "name":"sharry", "data": { "2018-08-01":1401231321 } },
  { "name":"sharry", "data": { "2018-08-04":2500000000 } }
];

let data = user_usage.reduce((a, c) => {
  let key = Object.keys(c.data)[0];
  let found = a.find(v => v.name === c.name);
  if(found){
    found.data[key] = c.data[key];
  }else{
    a.push(c);
  }
  return a;
}, [])

console.log(data);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51765106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档