我有一個不同長度的陣列,其中包含物件,其中每組 4 對應于一個感興趣的元素(不幸的是,這個陣列無法更改)
顯然,除了描述、糾正措施等之外,還有很多重復的資料。
[
{
ids: ['123', '124'],
referenceNumbers: [],
description: '',
},
{
ids: ['123', '124'],
referenceNumbers: [],
correctiveAction: '',
},
{
ids: ['123', '124'],
referenceNumbers: [],
correctedBy: '',
},
{
ids: ['123', '124'],
referenceNumbers: [],
description: '',
correctedDate:
},
...
]
我正在尋找一種更優雅、更有效的方法來合并此陣列中的每組 4 個元素,而不會復制公共欄位。
這是我目前的解決方案,它以我需要的方式作業,盡管效率低下:
const handleMergeDef = (defArr) => {
let tempArr = []
for (let i = 0; i < defArr.length; i ) {
tempArr.push({
ids: defArr[i].ids,
referenceNumbers: defArr[i].referenceNumbers,
description: defArr[i].description,
correctiveAction: defArr[i 1].correctiveAction,
correctedBy: defArr[i 2].correctedBy,
correctedDate: defArr[i 3].correctedDate
})
i =3
}
return tempArr
}
預期輸出:
[
{
ids: ['123', '124'],
referenceNumbers: [],
description: '',
correctiveAction: '',
correctedBy: '',
correctedDate: ''
},
{
ids: ['456', '457'],
referenceNumbers: [],
description: '',
correctiveAction: '',
correctedBy: '',
correctedDate: ''
},
...
]
uj5u.com熱心網友回復:
如果輸入可靠地出現在連續的四重奏中,那么您的解決方案就可以了。在陣列中向前尋找所需值的概念是必要的。您可以采用更復雜的分組方法,但這對您的案例來說可能只是不必要的開銷。
根據您要處理的資料量,您可以通過預定義輸出陣列長度并通過顯式索引分配物件來獲得一些性能*提升,而不是每次都推送/調整陣列大小。
const reduce = (array) => {
const n = array.length;
const output = new Array(Math.ceil(n / 4));
let i = 0;
let x = 0;
while (i < n) {
output[x ] = {
ids: array[i].ids,
referenceNumbers: array[i].referenceNumbers,
description: array[i].description,
correctiveAction: array[i 1].correctiveAction,
correctedBy: array[i 2].correctedBy,
correctedDate: array[i 3].correctedDate,
};
i = 4;
};
return output;
};
const input = [
{
ids: ['123', '124'],
referenceNumbers: [],
description: '',
},
{
ids: ['123', '124'],
referenceNumbers: [],
correctiveAction: 'Terminate',
},
{
ids: ['123', '124'],
referenceNumbers: [],
correctedBy: 'Jane',
},
{
ids: ['123', '124'],
referenceNumbers: [],
description: '',
correctedDate: "2022-10-31"
},
{
ids: ['456', '457'],
referenceNumbers: [],
description: '',
},
{
ids: ['456', '457'],
referenceNumbers: [],
correctiveAction: 'Promote',
},
{
ids: ['456', '457'],
referenceNumbers: [],
correctedBy: 'John',
},
{
ids: ['456', '457'],
referenceNumbers: [],
description: '',
correctedDate: "2022-11-01"
},
{
ids: ['678', '689'],
referenceNumbers: [],
description: '',
},
{
ids: ['678', '689'],
referenceNumbers: [],
correctiveAction: 'Transfer',
},
{
ids: ['678', '689'],
referenceNumbers: [],
correctedBy: 'Xander',
},
{
ids: ['678', '689'],
referenceNumbers: [],
description: '',
correctedDate: "2022-11-03"
},
];
const output = reduce(input);
console.log(output);
// minor translation for table display
console.table(output.map(o=>{
o.ids = o.ids.join(",");
o.referenceNumbers = o.referenceNumbers.join(",");
return o;
}));
<script src="https://gh-canon.github.io/stack-snippet-console/console.min.js"></script><style>.as-console-wrapper{display:block}</style><script>console.config({timeStamps:false,maximize:true})</script>
*這是一個 jsbench,它比較了您的實作和這些答案的性能。該測驗生成一個包含 128 個物件的輸入陣列。您的里程可能會根據您的系統負載而有所不同。隨意分叉測驗以嘗試不同的設定。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/526948.html
