简体   繁体   English

如何根据公共键值减少对象数组?

[英]How to reduce array of objects based on common key values?

Let's say, I have an Array of object which looks like:比方说,我有一个对象数组,它看起来像:

 var jsonData = [ {"DS01":123,"DS02":88888,"DS03":1,"DS04":2,"DS05":3,"DS06":666}, {"DS01":123,"DS02":88888,"DS03":2,"DS04":3,"DS05":4,"DS06":666}, {"DS01":124,"DS02":99999,"DS03":3,"DS04":4,"DS05":5,"DS06":333}, {"DS01":124,"DS02":99999,"DS03":5,"DS04":6,"DS05":7,"DS06":333} ];

You can see there are some common key fields which are DS01, DS02 and DS06.您可以看到有一些常见的关键字段,即 DS01、DS02 和 DS06。 Firstly, I want to find which are common group of keys .首先,我想找到哪些是常见的键组

  • For first 2 Objects : DS01 = 123, DS02 = 88888, DS06 = 666对于前 2 个对象: DS01 = 123,DS02 = 88888,DS06 = 666
  • For last 2 Objects : DS01 = 124, DS02 = 99999, DS06 = 333对于最后 2 个对象: DS01 = 124,DS02 = 99999,DS06 = 333

I want to convert this array of objects to a format like this:我想将此对象数组转换为如下格式:

 var jsonDataReduced = [{ "DS01": 123, "DS02": 88888, "DS03": [1, 2], "DS04": [2, 3], "DS05": [3, 4], "DS06": 666 }, { "DS01": 124, "DS02": 99999, "DS03": [3, 5], "DS04": [4, 6], "DS05": [5, 7], "DS06": 333 } ];

Let's say, I have another array of objects.比方说,我有另一个对象数组。

var jsonData2 = [{
    "Mass": 3,
    "Force": 3.1,
    "Acceleration": 4
}, {
    "Mass": 3,
    "Force": 4.1,
    "Acceleration": 4
}];

So after reducing it should be:所以减少后应该是:

var jsonData2 = [{
    "Mass": 3,
    "Force": [3.1, 4.1],
    "Acceleration": 4
}];

I have been trying to do these by using Array.reduce() but not getting an idea on how to do this job efficiently.我一直在尝试通过使用Array.reduce()来完成这些,但没有了解如何有效地完成这项工作。

Is it possible to是否有可能

  • making a single function制作单一功能
  • passing these kinds of array of objects as a parameter将这些类型的对象数组作为参数传递
  • and finally getting the reduced dataset并最终得到缩减的数据集

What I have tried :我尝试过的:

 var jsonData2 = [{ "Mass": 3, "Force": 3.1, "Acceleration": 4 }, { "Mass": 3, "Force": 4.1, "Acceleration": 4 }]; const reduced = jsonData2.reduce((r, e, i, a) => { if (i % 2 == 0) { const next = a[i + 1]; const obj = { ...e, Force: [e.Force] } if (next) obj.Force.push(next.Force); r.push(obj) } return r; }, []); console.log(reduced);

You could get common keys and group by them.您可以获取公共密钥并按它们分组。

 var data = [{ DS01: 123, DS02: 88888, DS03: 1, DS04: 2, DS05: 3, DS06: 666 }, { DS01: 123, DS02: 88888, DS03: 2, DS04: 3, DS05: 4, DS06: 666 }, { DS01: 124, DS02: 99999, DS03: 3, DS04: 4, DS05: 5, DS06: 333 }, { DS01: 124, DS02: 99999, DS03: 5, DS04: 6, DS05: 7, DS06: 333 }], common, temp = data.reduce((r, o, i) => { Object.entries(o).forEach(([k, v]) => { r[k] = r[k] || []; r[k][i] = v; }); return r; }, {}), min = Infinity, result; Object.entries(temp).forEach(([k, a]) => { var s = new Set; temp[k] = a.map(v => s.add(v).size); min = Math.min(min, s.size); }); common = Object.keys(temp).filter(k => temp[k][temp[k].length - 1] === min); result = data.reduce((r, o) => { var temp = r.find(q => common.every(k => q[k] === o[k])); if (!temp) { r.push({ ...o }); } else { Object.keys(o).filter(k => !common.includes(k)).forEach(k => Array.isArray(temp[k]) ? temp[k].push(o[k]) : (temp[k] = [temp[k], o[k]])); } return r; }, []); console.log(result);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM