我有這種型別的物件陣列:
[{
ID: 'MCHARPENT ',
REA: 4,
STO: 90,
EFFCAR: 178,
},
{
ID: 'I050MCHE ',
REA: 0,
STO: 125,
EFFCAR: 228,
},
{
ID: 'I050MCHE ',
REA: 0,
STO: 106,
EFFCAR: 231,
},
{
ID: 'DBALLAVOINE',
REA: 0,
STO: 107,
EFFCAR: 172,
}]
當 ID 為:
- 相同的(第二個和第三個物件)
- 或者當一個以 'I050' 之后的 3 個字母開頭時,如在本例中為字母 'MCH',它是第一個 ID 的開頭,在第二個 ID 的 I050 之后
如果匹配,則不帶“I050”的 ID 將取代名稱。此外,我必須對其他值求和。
使用這四個物件的結果應該如下所示:
{
ID: 'MCHARPENT',
REA: 4,
STO: 321,
EFFCAR: 637,
},
{
ID: 'DBALLAVOINE',
REA: 0,
STO: 107,
EFFCAR: 172,
}]
我無法找到一種方法來滿足這些條件。
uj5u.com熱心網友回復:
沒有進行任何排序,因為幸運的是給定的示例不需要它。這可能是一個問題,具體取決于您獲得的資料陣列。
let results = [];
let something = 'I050';
let items = [{ID: 'MCHARPENT ',REA: 4,STO: 90,EFFCAR: 178,},{ID: 'I050MCHE ',REA: 0,STO: 125,EFFCAR: 228,},{ID: 'I050MCHE ',REA: 0,STO: 106,EFFCAR: 231,},{ID: 'DBALLAVOINE',REA: 0,STO: 107,EFFCAR: 172,}];
items.forEach( item => {
if (item.ID.startsWith(something)) {
results.filter( result => {
if (result.ID.startsWith(item.ID.trim().slice(4, -1))) {
result.REA = result.REA item.REA;
result.STO = result.STO item.STO;
result.EFFCAR = result.EFFCAR item.EFFCAR;
} // could do an ELSE here pushing the item to results so it doesn't get lost if there is no match
});
} else {
results.push(item);
}
});
console.log(results);
uj5u.com熱心網友回復:
這里有2個簡單的for回圈
const data = [
{
ID: 'MCHARPENT ',
REA: 4,
STO: 90,
EFFCAR: 178,
},
{
ID: 'I050MCHE ',
REA: 0,
STO: 106,
EFFCAR: 231,
},
{
ID: 'I050MCHE ',
REA: 0,
STO: 125,
EFFCAR: 228,
},
{
ID: 'DBALLAVOINE',
REA: 0,
STO: 107,
EFFCAR: 172,
}];
const groupedData = [];
function canBeMerged(item1, item2){
if(item1.ID == item2.ID) return true;
let item1ID = item1.ID.substring(4, 7);
let item2ID = item2.ID.substring(0, 3);
if(item1ID == item2ID) return true;
item2ID = item2.ID.substring(4, 7);
item1ID = item1.ID.substring(0, 3);
if(item1ID == item2ID) return true;
return false;
}
function merge(group, datapoint){
group.REA = datapoint.REA;
group.STO = datapoint.STO;
group.EFFCAR = datapoint.EFFCAR;
}
for(let i = 0; i < data.length; i ){
if(i === 0){
groupedData.push(data[i]);
continue;
}
let added = false;
for(let j = 0; j < groupedData.length; j ){
if(canBeMerged(groupedData[j], data[i])){
merge(groupedData[j], data[i]);
added = true;
continue;
}
}
if(added === false)
groupedData.push(data[i]);
}
console.log(groupedData)
編輯 1:添加了檢查合并條件的功能。
uj5u.com熱心網友回復:
這是使用.sort()(檔案)和.reduce()(檔案)的一種方法
首先,我們對物件進行排序以將所有'I050'ID 放在最后(因為它們可能需要折疊到我們需要首先創建的現有物件中)
然后,我們減少結果并組合符合要求的物件。
const data = [{ID: 'MCHARPENT ', REA: 4, STO: 90, EFFCAR: 178}, {ID: 'I050MCHE ', REA: 0, STO: 125, EFFCAR: 228}, { ID: 'I050MCHE ', REA: 0, STO: 106, EFFCAR: 231}, { ID: 'DBALLAVOINE', REA: 0, STO: 107, EFFCAR: 172 }]
const result = data
// Move all of the 'I050' IDs to the end
.sort(obj => obj.ID.startsWith('I050') ? 1 : -1)
// Combine the data
.reduce((acc, curr) => {
// Find any existing object we would want to merge this into
const existingObj = acc.find(obj =>
// Has the same ID
obj.ID === curr.ID ||
// Or, if this is an 'I050', starts with the next 3 chars
(curr.ID.startsWith('I050') && obj.ID.startsWith(curr.ID.substring(4, 7))))
// If we find an object, merge them
if (existingObj) {
existingObj.REA = curr.REA
existingObj.STO = curr.STO
existingObj.EFFCAR = curr.EFFCAR
} else {
// If not, just add this as a new object
acc.push(curr)
}
// Return the new array
return acc
}, [])
console.log(result)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/507814.html
標籤:javascript
上一篇:為什么盒子右側有空間?
