簡體   English   中英

如何使用 javascript 從對象數組中執行添加相同鍵的對象值並返回唯一對象?

[英]How to perform addition of same keys' values of objects and return unique objects from array of objects using javascript?

我正在處理一項任務,其中我得到一個由對象數組組成的響應。

現在,我想根據特定條件對某些字段執行加法,並返回新的且唯一的對象數組,而不會出現任何重復。

這是回應。

let respData = [
  {
     "NEW": 0,
     "Working": 0,
     "Not Working": 2,
     "Broken": 0,
     "Location": "Karimnagar",
     "TotalPrice": 274500,
     "AssetsCount": 2,
     "AssetType": "Hardware Devices"
  },{
     "NEW": 1,
     "Working": 0,
     "Not Working": 0,
     "Broken": 0,
     "Location": "chennai",
     "TotalPrice": 4500,
     "AssetsCount": 1,
     "AssetType": "Undefined"
  },{
     "NEW": 0,
     "Working": 0,
     "Not Working": 0,
     "Broken": 0,
     "Location": "Undefined",
     "TotalPrice": 0,
     "AssetsCount": 1,
     "AssetType": "Undefined"
  },{
     "NEW": 1,
     "Working": 0,
     "Not Working": 0,
     "Broken": 0,
     "Location": "Karimnagar",
     "TotalPrice": 12500,
     "AssetsCount": 1,
     "AssetType": "Hardware Devices"
  },{
     "NEW": 0,
     "Working": 1,
     "Not Working": 0,
     "Broken": 0,
     "Location": "Karimnagar",
     "TotalPrice": 1200,
     "AssetsCount": 1,
     "AssetType": "Hardware Devices"
  }
]

如果AssetTypeLocation相同,現在我嘗試在對象中添加 integer 值。

如果不存在匹配的結果,則需要按原樣返回。

添加它們之后,我需要返回具有所有更新值的唯一對象數組。

我已經嘗試使用mapfilter來獲得結果,但無法獲得正確的結果。

這是我嘗試過的代碼。

let respCopy = respData;
let finalObj = {}, testArray = [];

respCopy.forEach((copyData, i) => {
        respData.forEach((data, j) => {
            if(i !== j && copyData.AssetType === data.AssetType && copyData.Location === data.Location){
                assetConditions.forEach((condition, k) => {
                    if(copyData[condition.name]){
                        finalObj[condition.name] = copyData[condition.name] + data[condition.name];
                        finalObj["AssetType"] = copyData.AssetType;
                        finalObj["Location"] = copyData.Location;
                        copyData[condition.name] = 0;
                        data[condition.name] = 0;
                    }
                })
            }else if(i == j && copyData.AssetType === data.AssetType && copyData.Location === data.Location){
                assetConditions.forEach((condition, k) => {
                    if(copyData[condition.name]){
                        finalObj[condition.name] = copyData[condition.name];
                        finalObj["AssetType"] = copyData.AssetType;
                        finalObj["Location"] = copyData.Location;
                        copyData[condition.name] = 0;
                        data[condition.name] = 0;
                    }
                })
            }
        });
        testArray.push(finalObj);
    })

這是預期的結果。

[
  {
     "NEW": 1,
     "Working": 1,
     "Not Working": 2,
     "Broken": 0,
     "Location": "Karimnagar",
     "TotalPrice": 288200,
     "AssetsCount": 4,
     "AssetType": "Hardware Devices"
  },{
     "NEW": 1,
     "Working": 0,
     "Not Working": 0,
     "Broken": 0,
     "Location": "chennai",
     "TotalPrice": 4500,
     "AssetsCount": 1,
     "AssetType": "Undefined"
  },{
     "NEW": 0,
     "Working": 0,
     "Not Working": 0,
     "Broken": 0,
     "Location": "Undefined",
     "TotalPrice": 0,
     "AssetsCount": 1,
     "AssetType": "Undefined"
  }
]

我在 Codepen 中嘗試過的代碼

得到結果有什么錯誤嗎?

使用字典 object 作為代理可以輕松解決此類問題。

您必須將對象的鍵定義為您的唯一標識符(在您的情況下是AssetTypeLocation值的串聯),然后將 map 定義為您想要創建唯一數組的對象。

最終你會想要返回你的字典 object 的Object.values()

 const arrayWithDuplicates = [{ key1: 1, key2: 2, foo: 1 }, { key1: 1, key2: 2, foo: 2 }, // Note the two first elements have identical keys { key1: 3, key2: 2, foo: 3 }, ]; function getDictKey(element) { // This can obviously be implemented otherwise const { key1, key2 } = element; return `${key1}_${key2}`; } const dictionary = {}; arrayWithDuplicates.forEach((element) => { const key = getDictKey(element); if (dictionary[key]) { dictionary[key].foo += element.foo; } else { dictionary[key] = element; } }); const arrayWithoutDuplicates = Object.values(dictionary); console.log(arrayWithoutDuplicates);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM