問題陳述的解釋:我有兩個陣列A和B:
A = [
{
"isAvailable" : true,
"productCode" : "12103977",
"size" : "UK/IND-3",
"url" : "/asics-mens-gel-kayano-28-harmony-blue-running-shoes/12103977"
},
{
"isAvailable" : true,
"productCode" : “12103978",
"size" : "UK/IND-4",
"url" : "/asics-mens-gel-kayano-28-harmony-blue-running-shoes/12103978"
},
{
"isAvailable" : true,
"productCode" : "12103979",
"size" : "UK/IND-8",
"url" : "/asics-mens-gel-kayano-28-harmony-blue-running-shoes/12103979"
},
]
B = [
{
"dimensionSize" : "3",
"euroSize" : "36",
"usSize" : "4"
},
{
"dimensionSize" : "4",
"euroSize" : "36",
"usSize" : "4"
},
{
"dimensionSize" : "10",
"euroSize" : "36",
"usSize" : "4"
},
]
我需要根據以下條件創建一個新的陣列 C :
條件:“如果陣列A中任意物件的“ size ”鍵中包含的值包含陣列B中任意物件的鍵“ dimensionSize ”中包含的值,則將陣列B中對應的匹配物件添加到陣列C中”。
所以在滿足上述條件后,陣列 C 將如下所示 -
C = [
{
"dimensionSize" : "3",
"euroSize" : "36",
"usSize" : "4"
},
{
"dimensionSize" : "4",
"euroSize" : "36",
"usSize" : "4"
},
]
如何獲得陣列 C 的說明:在陣列 A 中,有一個物件具有鍵“size”,其值為“UK-IND-3”,其中包含來自陣列的物件之一中鍵“dimensionSize”的值“3” B.同樣適用于具有關鍵“大小”值“ UK-IND-4 ”的物件
我找到這個問題的解決方案的動機:我有巨大的陣列,我需要運行類似于上面的條件來過濾掉新陣列中的一些資料。我已經在堆疊溢位中看到了其他解決方案,并且我已經使用過濾器、包含、某些、映射等陣列方法得出了一個解決方案,但我需要一個有效的解決方案,該解決方案對實時資料有效,例如具有巨大長度的陣列。
非常感謝分享有效演算法或前進路徑的任何幫助。先感謝您!
編輯:我擁有的現有解決方案在 O(n^2) 中運行。假設 A 和 B 作為我的問題陳述中的陣列。matchArray是結果陣列。
let matchArray;
matchArray = B.filter(objB => {
let match = false;
A.forEach(objA => {
if (objA.size.includes(objB.dimensionSize) {
match = true;
}
});
return match;
});
編輯 2:陣列 B 和陣列 C 的結構不正確。我現在已經更正了。
uj5u.com熱心網友回復:
O(n) 復雜度的解決方案
const solution = (A, B) => {
const allowedSizes = new Set()
A.forEach(({ size }) => {
const [ s ] = size.match(/\d $/g)
allowedSizes.add(s)
})
return B.filter(({ dimensionSize }) => {
return allowedSizes.has(dimensionSize)
})
}
const A = [
{
"isAvailable" : true,
"productCode" : "12103977",
"size" : "UK/IND-3",
"url" : "/asics-mens-gel-kayano-28-harmony-blue-running-shoes/12103977"
},
{
"isAvailable" : true,
"productCode" : "12103978",
"size" : "UK/IND-4",
"url" : "/asics-mens-gel-kayano-28-harmony-blue-running-shoes/12103978"
},
{
"isAvailable" : true,
"productCode" : "12103979",
"size" : "UK/IND-8",
"url" : "/asics-mens-gel-kayano-28-harmony-blue-running-shoes/12103979"
},
]
const B = [
{
"dimensionSize" : "3",
"euroSize" : "36",
"usSize" : "4"
},
{
"dimensionSize" : "4",
"euroSize" : "36",
"usSize" : "4"
},
{
"dimensionSize" : "10",
"euroSize" : "36",
"usSize" : "4"
},
]
console.log(solution(A, B))
uj5u.com熱心網友回復:
所有功勞歸功于 Lukainchuk 的回答,以下是對您更新的改編并附有解釋:
- 創建一個
Set值A[i].size- Set 只包含每個值一次,在您的示例中,filterSet 將包含 (3,4,8) - 這是在 O(n) 中完成的
let filterSet = new Set();
A.forEach(i => filterSet.add(i.size.match(/\d $/)[0]));
Set有一個has()方法,它在 O(1) 中回傳,可以在B.filterO(n) 復雜度的方法中使用:
let result = B.filter(i => filterSet.has(i.dimensionSize))
uj5u.com熱心網友回復:
這是一個作業示例,首先它在 A 中創建一個具有所有可用大小的物件,然后過濾 B 以僅保留dimensionSize作為 key 存在的物件listedSizes
console.clear();
(()=>{
let A = [{
"isAvailable": true,
"productCode": "12103977",
"size": "UK/IND-3",
"url": "/asics-mens-gel-kayano-28-harmony-blue-running-shoes/12103977"
}, {
"isAvailable": true,
"productCode": "12103978",
"size": "UK/IND-4",
"url": "/asics-mens-gel-kayano-28-harmony-blue-running-shoes/12103978"
}, {
"isAvailable": true,
"productCode": "12103979",
"size": "UK/IND-8",
"url": "/asics-mens-gel-kayano-28-harmony-blue-running-shoes/12103979"
}, ]
let B = [{
"dimensionList": [{
"dimensionSize": "3",
"euroSize": "36",
"usSize": "4"
}]
}, {
"dimensionList": [{
"dimensionSize": "4",
"euroSize": "36",
"usSize": "4"
}]
}, {
"dimensionList": [{
"dimensionSize": "10",
"euroSize": "36",
"usSize": "4"
}]
}];
let listedSizes = Object.fromEntries(A.map(e=>[(e.size.match(/UK\/IND-(\d) /) || [0, 0])[1],0]));
let filteredB = B.filter(e=>listedSizes.hasOwnProperty(e.dimensionList[0].dimensionSize));
console.log(listedSizes, filteredB);
}
)();
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/490780.html
標籤:javascript 数组 时间复杂度
