我有從外部系統匯入的 JSON 物件,其中一些在 ID 值中是重復的。敵人示例:
{
"ID": "1",
"name": "Bob",
"ink": "100"
},
{
"ID":"2",
"Name": "George",
"ink": "100"
},
{
"ID":"1",
"name": "Bob",
"ink":"200"
}
我正在處理每個物件的資訊,然后將它們推送到一個新的 JSON 陣列中:
var array = {};
array.users = [];
for (let user of users) {
function (user) => {
...
array.users.push(user);
}
}
我需要洗掉所有重復項,保存墨水鍵中值最高的那個。我找到了在構建陣列之后為陣列執行此操作的解決方案,但這意味著我沒有任何理由使用系統資源 - 沒有理由操縱無論如何都會被洗掉的用戶。
我正在尋找一種方法來檢查每個新用戶是否具有該 ID:值對的用戶已經存在于 array.users[] 陣列中,如果存在,則比較墨鍵的值,如果它更高 - 洗掉現有的陣列,然后我可以繼續我的操作代碼并將新用戶推送到陣列中。
關于什么是最優雅/最有效/最短的方法來實作這一點的任何想法?
uj5u.com熱心網友回復:
我不確定我是否完全理解你的問題。如果我理解正確,您不想在構造完整個陣列并檢查重復項后通過它嗎?
“如果有疑問,請在問題上扔一個哈希圖”。使用地圖而不是普通陣列。映射鍵存盤 ID。并將您的欄位保存為值。如果密鑰已經存在,那么您可以檢查哪個值更高。
代碼示例應該有點像這樣:
let userMap = new Map()
for (let user in users) {
if (userMap.has(user["ID"]) //Look which ink is bigger
else //Store new entry
}
編輯:我的解決方案確實需要一個額外的步驟,并且不是直接在原始陣列中完成。但是,我仍然認為地圖可能是處理此問題的最有效方法之一......
uj5u.com熱心網友回復:
var array = {};
array.users = users.filter((user)=>{
for (let userSecond of users) {
if(userSecond.id === user.id && userSecond.ink > user.ink){
return false;
}
}
return true;
});
也許不是最干凈的解決方案,但它應該可以完成這項作業。基本上你過濾用戶。在過濾器中,您再次檢查每個用戶以檢查他們中的任何一個是否具有相同的 id 和更多的墨水,如果是,則應通過回傳 false 來丟棄當前用戶。如果沒有找到具有相同 id 和更多墨水的用戶,則當前用戶將留在陣列中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/460576.html
