簡體   English   中英

如何根據公共鍵值減少對象數組?

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

比方說,我有一個對象數組,它看起來像:

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

您可以看到有一些常見的關鍵字段,即 DS01、DS02 和 DS06。 首先,我想找到哪些是常見的鍵組

  • 對於前 2 個對象: DS01 = 123,DS02 = 88888,DS06 = 666
  • 對於最后 2 個對象: DS01 = 124,DS02 = 99999,DS06 = 333

我想將此對象數組轉換為如下格式:

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

比方說,我有另一個對象數組。

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

所以減少后應該是:

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

我一直在嘗試通過使用Array.reduce()來完成這些,但沒有了解如何有效地完成這項工作。

是否有可能

  • 制作單一功能
  • 將這些類型的對象數組作為參數傳遞
  • 並最終得到縮減的數據集

我嘗試過的:

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

您可以獲取公共密鑰並按它們分組。

 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