我有 2 個帶有動態鍵的物件陣列(我從不知道鍵的名稱);例子:
hierarchy1: [
{
level1: 'Shoes',
}
]
hierarchy2: [
{
level1: 'Shoes',
level2: 'Sneakers',
},
]
我需要找到hierarchy1和hierarchy2之間的交集。我不能使用 lodash _.intersectionBy 因為我不知道我將在hierarchy1中獲得的密鑰的名稱。
我希望得到這樣的結果 [{ level1: 'Shoes' }] 任何想法如何解決這個問題?
非常感謝!
uj5u.com熱心網友回復:
如果你想與每個索引進行比較,那么你可以做這樣的事情
顯示代碼片段
const hierarchy1 = [{
level1: 'Shoes',
level3: "xyz"
}]
const hierarchy2 = [{
level1: 'Shoes',
level2: 'Sneakers',
}, {
level3: "xyz"
}]
function intersection(arr1, arr2) {
let final = []
// loop over first array
for (let i = 0; i < arr1.length; i ) {
let element = arr1[i]
let temp = {}
// loop over all indexes of second array
for (let data of arr2) {
// check every key fro data to see if there's any intersection
Object.keys(data).forEach(key => {
if (data[key] === element[key] && key in element) {
temp[key] = element[key]
}
})
}
// if we found any intersection push it in final array
if (Object.keys(temp).length) {
final.push(temp)
}
}
return final
}
console.log(intersection(hierarchy1, hierarchy2))
對第一種方法的改進是進行一些預先計算,您可以簡單地將特定鍵的所有值組合在一起,并且在回圈時您可以檢查給定鍵是否存在特定值
顯示代碼片段
const hierarchy1 = [{
level1: 'Shoes',
level3: "xyz"
},{level2: "abc"}]
const hierarchy2 = [{
level1: 'Shoes',
level2: 'Sneakers',
}, {
level3: "xyz",
level2: "abc"
}]
function intersection(arr1, arr2) {
let final = []
let map = {}
for(let data of arr2){
Object.keys(data).forEach(key => {
map[key] = map[key] || new Set()
map[key].add(data[key])
})
}
// loop over first array
for (let i = 0; i < arr1.length; i ) {
let element = arr1[i]
let temp = {}
Object.keys(element).forEach(key => {
if (key in map && map[key].has(element[key])) {
temp[key] = element[key]
}
})
// if we found any intersection push it in final array
if (Object.keys(temp).length) {
final.push(temp)
}
}
return final
}
console.log(intersection(hierarchy1, hierarchy2))
如果您只想比較各自的索引或兩個陣列,您可以執行以下操作
顯示代碼片段
const hierarchy1 = [{
level1: 'Shoes',
}]
const hierarchy2 = [{
level1: 'Shoes',
level2: 'Sneakers',
},]
function intersection(arr1,arr2){
let final = []
for(let i=0; i<arr1.length; i ){
let element = arr1[i]
let temp = {}
Object.keys(element).forEach(key => {
if(key in arr2[i] && arr2[i][key] === element[key]){
temp[key] = element[key]
}
})
if(Object.keys(temp).length){
final.push(temp)
}
}
return final
}
console.log(intersection(hierarchy1,hierarchy2))
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/488162.html
標籤:javascript 数组 罗达什
下一篇:角度測驗'訂閱不是功能'
