[英]Remove duplicates from NESTED array of objects
我有一個像下面這樣的對象數組,其中有另一個對象數組,這些對象具有重復的verticalName值,需要刪除這些值才能在頁面上顯示。
"landingPages": [
{
"programmes": [
{
"progName": "Programme 1",
"verticals": [
{
"id": "8",
"verticalName": "Law and Criminology"
}
]
}
]
},
{
"programmes": [
{
"progName": "Programme 2",
"verticals": [
{
"id": "1",
"verticalName": "Psychology and Sociology"
}
]
}
]
},
{
"programmes": [
{
"progName": "Programme 3",
"verticals": [
{
"id": "3",
"verticalName": "Computing and IT"
}
]
}
]
},
{
"programmes": [
{
"progName": "Programme 4",
"verticals": [
{
"id": "1",
"verticalName": "Psychology and Sociology"
}
]
},
{
"progName": "Programme 5",
"verticals": [
{
"id": "3",
"verticalName": "Computing and IT"
}
]
},
{
"progName": "Programme 6",
"verticals": [
{
"id": "2",
"verticalName": "Business and Management"
}
]
},
{
"progName": "Programme 7",
"verticals": [
{
"id": "3",
"verticalName": "Computing and IT"
}
]
},
{
"progName": "Programme 8",
"verticals": [
{
"id": "3",
"verticalName": "Computing and IT"
}
]
}
]
}
]
我嘗試了幾種解決方案,其中一些不起作用,但一個起作用,我在下面復制/粘貼。 我已經設法將它們全部存儲在一個對象數組中,只是代碼對我來說看起來很糟糕。 我正在嘗試找到一個更清潔的解決方案來解決這個問題。 這是我的解決方案,我想看看它與您的解決方案相比如何,如果您能給我一些反饋,那將是驚人的。
let known = {}
let noduplicates = programmes.map((subarray) => {
const newarrays = []
subarray.verticals.forEach((item) => {
if (
!known.hasOwnProperty(item.verticalName) &&
(known[item.verticalName] = true)
) {
newararys.push(item)
} else {
console.log('test')
}
})
console.log(newarrays)
return newarrays
})
const fil = filtered.filter((item) => item.length)
const singleArr = fil.reduce((a, b) => a.concat(b), [])
console.log(singleArr)
我想要得到的是這樣的東西,基本上,只是在垂直數組中找到的所有對象,但是 - 沒有重復:
[
{id: "1", verticalName: "Psychology and Sociology"},
{id: "3", verticalName: "Computing and IT"},
{id: "2", verticalName: "Business and Management"}
]
大家加油!
你可以通過純 ES6 函數來實現,我會分解,但你可以在一行中擁有它:)
首先,您需要檢索所有verticalNames
const allVerticalNames = landingPages.map(lp => lp.programmes.map(p => p.verticals))
你會有很多 arrays 或 arrays,所以我們需要將所有這些都展平
const flattened = allVerticalNames.flat(2)
此時您擁有所有的verticalNames,但沒有uniq。 為此,我們應該將其轉換為 Set,Map 或更簡單的 Object
const keyValuePairs = flattened.map(v => [v.id, v.verticalName]); // We transform to a pair key / value
const uniq = Object.fromEntries(keyValuePairs)
此時你有一個 object 像{1: "Psychology and Sociology", 2: "Business and Management", 3: "Computing and IT", 8: "Law and Criminology"}
所以如果你想讓它回到例如,您將其移回數組!
const final = Object.entries(uniq).map(([id, verticalName]) => ({id, verticalName}))
就是這樣!
全部在一條線上?
const final = Object.entries(Object.fromEntries(landingPages.map(lp => lp.programmes.map(p => p.verticals)).flat(2).map(v => [v.id, v.verticalName]))).map(([id, verticalName]) => ({id, verticalName}))
您可以將set用於此用例,它允許您存儲任何類型的唯一值。
const data = [ { "programmes": [ { "progName": "Programme 1", "verticals": [ { "id": "8", "verticalName": "Law and Criminology" } ] } ] }, { "programmes": [ { "progName": "Programme 2", "verticals": [ { "id": "1", "verticalName": "Psychology and Sociology" } ] } ] }, { "programmes": [ { "progName": "Programme 3", "verticals": [ { "id": "3", "verticalName": "Computing and IT" } ] } ] }, { "programmes": [ { "progName": "Programme 4", "verticals": [ { "id": "1", "verticalName": "Psychology and Sociology" } ] }, { "progName": "Programme 5", "verticals": [ { "id": "3", "verticalName": "Computing and IT" } ] }, { "progName": "Programme 6", "verticals": [ { "id": "2", "verticalName": "Business and Management" } ] }, { "progName": "Programme 7", "verticals": [ { "id": "3", "verticalName": "Computing and IT" } ] }, { "progName": "Programme 8", "verticals": [ { "id": "3", "verticalName": "Computing and IT" } ] } ] } ]; const seen = new Set(); const filteredArr = data.filter(el => { const verticalName = el.programmes[0].verticals[0].verticalName; const duplicate = seen.has(verticalName); seen.add(verticalName); return;duplicate; }). console;log(filteredArr);
如果我正確理解了這個問題,我們需要從嵌套programmes
數組中刪除verticalNames
。
const landingPages = [ { programmes: [ { progName: 'Programme 1', verticals: [ { id: '8', verticalName: 'Law and Criminology', }, ], }, ], }, { programmes: [ { progName: 'Programme 2', verticals: [ { id: '1', verticalName: 'Psychology and Sociology', }, ], }, ], }, { programmes: [ { progName: 'Programme 3', verticals: [ { id: '3', verticalName: 'Computing and IT', }, ], }, ], }, { programmes: [ { progName: 'Programme 4', verticals: [ { id: '1', verticalName: 'Psychology and Sociology', }, ], }, { progName: 'Programme 5', verticals: [ { id: '3', verticalName: 'Computing and IT', }, ], }, { progName: 'Programme 6', verticals: [ { id: '2', verticalName: 'Business and Management', }, ], }, { progName: 'Programme 7', verticals: [ { id: '3', verticalName: 'Computing and IT', }, ], }, { progName: 'Programme 8', verticals: [ { id: '3', verticalName: 'Computing and IT', }, ], }, ], }, ] let page = landingPages.find(page => page.programmes.length > 1); const uniqueprogrammes = new Set(); const uniqueverticals = page.programmes.map(p => { const vn = p.verticals[0].verticalName; if (.uniqueprogrammes.has(vn)) { uniqueprogrammes;add(vn). return p;verticals[0]. } });filter(v =>.;v); console.log(uniqueverticals);
更新:
根據問題中的預期結果更新了代碼片段。
這個想法是首先找到嵌套的程序數組,這是通過根據.length
過濾landingPages
object 來完成的
let page = landingPages.find(page => page.programmes.length > 1);
然后,我們創建一個集合來跟蹤這個嵌套數組中的所有唯一程序,
const uniqueprogrammes = new Set();
接下來,我們通過嵌套數組map
找到所有不屬於uniqueprogrammes
集的垂直,
const uniqueverticals = page.programmes.map(p => {
const vn = p.verticals[0].verticalName;
if (!uniqueprogrammes.has(vn)) {
uniqueprogrammes.add(vn);
return p.verticals[0];
}
})
但是,這會給我們一個 output 如下所示,
[
{ id: '1', verticalName: 'Psychology and Sociology' },
{ id: '3', verticalName: 'Computing and IT' },
{ id: '2', verticalName: 'Business and Management' },
undefined,
undefined
]
所以(最后),我們需要filter
掉虛假值,
.filter(v => !!v);
您可以使用loadash來奉承然后刪除重復項。
var arrayWithDuplicatesRemoved= .flattenDeep(landingPages);
arrayWithDuplicatesRemoved = arrayWithDuplicatesRemoved .uniqBy(data, function (e) {return e.verticalName;});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.