![](/img/trans.png)
[英]JavaScript - filter array of objects by content of primitive array in O(n)
[英]In JavaScript, from two array of objects I need to filter out objects based on a filter condition, in a new array in complexity less than O(n^2)
問題陳述的解釋:我有兩個數組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 的結構不正確。 我現在已經更正了。
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))
所有學分都歸於@kerm 的回答,這是對您更新的修改並附有解釋:
Set
A[i].size
值 - 集合僅包含每個值一次,在您的示例中,filterSet 將包含 (3,4,8) - 這是在 O(n) 中完成的let filterSet = new Set();
A.forEach(i => filterSet.add(i.size.match(/\d+$/)[0]));
Set
有一個has()方法,該方法在 O(1) 中返回,可以在復雜度為 O(n) 的B.filter
方法中使用:let result = B.filter(i => filterSet.has(i.dimensionSize))
這是一個工作示例,首先它在 A 中創建一個具有所有可用大小的對象,然后過濾 B 以僅保留具有dimensionSize
作為鍵值存在於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); } )();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.