【问题标题】:Merge array of objects dynamically with same key使用相同的键动态合并对象数组
【发布时间】:2020-04-08 09:15:02
【问题描述】:

我想用同一个键动态合并多个对象的单个数组。数据示例如下:

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"
}]

我想生成这样的数据

newData = [{
  "30 Apr 2017BDT",
  "1.00000",
  "0.0",
  "0.01107",
  "0.1"
}, {
  "29 Apr 2017BDT",
  "1.00000",
  "0.0",
  "0.01107",
  "-0.5"
}];

我需要建议或帮助如何解决此问题。

【问题讨论】:

  • 什么是关键,你的合并标准是什么?
  • Key 是 ReportTime 当我们找到需要合并该对象的相同报告时间时
  • 您尝试创建的数据结构无效,因为对象中的属性没有值。
  • @RoryMcCrossan 好的,您能告诉我如何将具有相同属性名称的两个对象合并到一个数组中吗?
  • 为什么速率和平均增长没有合并到您的输出中?它们只是新属性..

标签: javascript jquery arrays object


【解决方案1】:

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

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);
.as-console-wrapper { max-height: 100% !important; top: 0; }

这是一种使用 es5(old) 语法的替代方法:

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));

【讨论】:

  • 这正是我想要的解决方案,但给了我一个错误Property 'values' does not exist on type 'ObjectConstructor'.
  • @ParthRaval 你在使用打字稿吗?如果是,那么这就是答案.. stackoverflow.com/questions/52304422/…
【解决方案2】:

您可以使用 reduce 将值按ReportTime 分组

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)

【讨论】:

    【解决方案3】:

    我认为如果将 ReportTime 分组为保持 Rate 和 AvgGrowth 的对象会很有帮助。

    检查项目,使用“ReportTime”键构建一个对象。 当对象中已经存在 ReportTime 时,只需更新 Rate 和 AvgGrowth。 迭代结束后,获取上述对象的Object.values(),将其作为数组获取。

    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));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-09
      • 2021-12-27
      • 1970-01-01
      • 2021-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多