【问题标题】:Looping through object properties of an array and comparing [duplicate]循环遍历数组的对象属性并比较[重复]
【发布时间】:2019-08-09 08:18:54
【问题描述】:

我有一个包含多个属性的对象数组,看起来像这样:

[
  {
    "title" = "Test",
    "prop1" = 4,
    "prop2" = 6
  },
  {
    "title" = "Test2",
    "prop1" = 5,
    "prop2" = 7
  },
  {
    "title" = "Test",
    "prop1" = 6,
    "prop2" = 14
  }
]

我想做的,是……

  • 循环遍历对象
  • 比较标题,以后每个标题只有一个输出
  • 总结同名对象的属性

所以最后我的输出会是……

  • 测试,10、20
  • 测试2、5、7

我尝试将值存储在变量中,比较这些变量,但这仅适用于两组数据,在我的情况下,可能还有五组、十组或 15 组具有相同标题的数据。

任何帮助表示赞赏,谢谢! :)

附加信息:我需要按名称访问属性,例如 data[1]['title']

【问题讨论】:

  • 让我们看看你尝试过的所有代码。
  • 首先,在对象内部创建一个键值对,用于应用索引和循环。
  • 你可以使用 loadash 库 const Titles = _.groupBy(objects, obj => car.title);获取按相同标题分组的列表

标签: javascript arrays loops object


【解决方案1】:

我们可以使用Array.prototype.reduce 来累积数组的已处理条目,并且通过处理我的意思是通过使用Array.prototype.findIndex 并将title 以外的属性相加来找到共享相同title 的元素:

const data = [
  {
    "title" : "Test",
    "prop1" : 4,
    "prop2" : 6
  },
  {
    "title" : "Test2",
    "prop1" : 5,
    "prop2" : 7
  },
  {
    "title" : "Test",
    "prop1" : 6,
    "prop2" : 14
  }
];
const out = data.reduce((r, e) => {
  let idx = r.findIndex(o => e.title === o.title);
  if(idx >= 0 ){
    r[idx].prop1 += e.prop1;
    r[idx].prop2 += e.prop2;
  }else{
    r.push(e);
  }
  return r;
}, []);
console.log(out);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-13
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    • 2014-01-23
    相关资源
    最近更新 更多