首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用相同的键动态合并对象数组

用相同的键动态合并对象数组
EN

Stack Overflow用户
提问于 2020-04-08 09:15:02
回答 3查看 708关注 0票数 0

我希望用相同的键动态合并多个对象的单个数组。数据的一个例子是:

代码语言:javascript
复制
var data = [{
  ReportTime: "30 Apr 2017BDT",
  Rate: "1.00000",
  AvgGrowth: "0.0"
}, {
  ReportTime: "30 Apr 2017BDT",
  Rate: "0.01107",
  AvgGrowth: "0.1"
}, {
  ReportTime: "29 Apr 2017BDT",
  Rate: "1.00000",
  AvgGrowth: "0.0"
}, {
  ReportTime: "29 Apr 2017BDT",
  Rate: "0.01107",
  AvgGrowth: "-0.5"
}]

我想生成这样的数据

代码语言:javascript
复制
newData = [{
  "30 Apr 2017BDT",
  "1.00000",
  "0.0",
  "0.01107",
  "0.1"
}, {
  "29 Apr 2017BDT",
  "1.00000",
  "0.0",
  "0.01107",
  "-0.5"
}];

我需要一个建议或帮助如何解决这个问题。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-04-08 09:26:40

您的预期输出看起来不是一个有效的JS。但是,您可以通过使用.reduce().map()Object.entries()等几种方法迭代数组来获得数组。

代码语言:javascript
复制
const data = [
  {ReportTime: "30 Apr 2017BDT", Rate: "1.00000", AvgGrowth: "0.0"},
  {ReportTime: "30 Apr 2017BDT", Rate: "0.01107", AvgGrowth: "0.1"},
  {ReportTime: "29 Apr 2017BDT", Rate: "1.00000", AvgGrowth: "0.0"},
  {ReportTime: "29 Apr 2017BDT", Rate: "0.01107", AvgGrowth: "-0.5"}
];

const result = Object.entries(
  data.reduce((r, {ReportTime, ...rest}) => {
    r[ReportTime] = (r[ReportTime] || []).concat(Object.values(rest));
    return r;
  }, {})
).map(([k, v]) => [k, ...v]);

console.log(result);
代码语言:javascript
复制
.as-console-wrapper { max-height: 100% !important; top: 0; }

下面是使用es5(旧的)语法的另一种方法:

代码语言:javascript
复制
var data = [
  {ReportTime: "30 Apr 2017BDT", Rate: "1.00000", AvgGrowth: "0.0"},
  {ReportTime: "30 Apr 2017BDT", Rate: "0.01107", AvgGrowth: "0.1"},
  {ReportTime: "29 Apr 2017BDT", Rate: "1.00000", AvgGrowth: "0.0"},
  {ReportTime: "29 Apr 2017BDT", Rate: "0.01107", AvgGrowth: "-0.5"}
];
var key = 'ReportTime';

var reducer = function(data, key) {
  var result = [];
  var map = {};
  
  data.forEach(function(o, i) {
    map[o[key]] = map[o[key]] || [];
    
    for(var k in o) {
      if(!(k === key)) { map[o[key]].push(o[k]); }
    };
  });
  
  for(var j in map) {
    result.push([].concat(j, map[j]));
  };
  
  return result;
};

console.log(reducer(data, key));

票数 1
EN

Stack Overflow用户

发布于 2020-04-08 09:25:36

可以通过ReportTime将值归为组。

代码语言:javascript
复制
const data = [{ ReportTime: "30 Apr 2017BDT", Rate: "1.00000", AvgGrowth: "0.0"}, { ReportTime: "30 Apr 2017BDT", Rate: "0.01107", AvgGrowth: "0.1"}, { ReportTime: "29 Apr 2017BDT", Rate: "1.00000", AvgGrowth: "0.0"
}, { ReportTime: "29 Apr 2017BDT", Rate: "0.01107", AvgGrowth: "-0.5"}]

const merged = data.reduce((op, inp) => {
  let key = inp.ReportTime
  op[key] = op[key] || []
  op[key].push(inp)
  return op
}, Object.create(null))

console.log(merged)

票数 1
EN

Stack Overflow用户

发布于 2020-04-08 09:29:42

我认为,如果将group变成具有维护速率和AvgGrowth的对象,将很有帮助。

检查项目,构建一个带有键的对象,其名称为"ReportTime“。当ReportTime已经存在于对象中时,只需更新速率和AvgGrowth。迭代之后,获取上述对象的Object.values()作为数组。

代码语言:javascript
复制
const update = data => {
  const res = {};
  data.forEach(item => {
    if (!res[item.ReportTime]) {
      res[item.ReportTime] = {
        ReportTime: item.ReportTime,
        Rate: [],
        AvgGrowth: []
      };
    }
    res[item.ReportTime].Rate.push(item.Rate);
    res[item.ReportTime].AvgGrowth.push(item.AvgGrowth);
  });
  return Object.values(res);
};

var data = [
  {
    ReportTime: "30 Apr 2017BDT",
    Rate: "1.00000",
    AvgGrowth: "0.0"
  },
  {
    ReportTime: "30 Apr 2017BDT",
    Rate: "0.01107",
    AvgGrowth: "0.1"
  },
  {
    ReportTime: "29 Apr 2017BDT",
    Rate: "1.00000",
    AvgGrowth: "0.0"
  },
  {
    ReportTime: "29 Apr 2017BDT",
    Rate: "0.01107",
    AvgGrowth: "-0.5"
  }
];

console.log(update(data));

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

https://stackoverflow.com/questions/61097200

复制
相关文章

相似问题

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