簡體   English   中英

在 JavaScript 中,我需要從兩個對象數組中根據過濾條件過濾掉對象,在一個復雜度小於 O(n^2) 的新數組中

[英]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)

問題陳述的解釋:我有兩個數組AB

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 的回答,這是對您更新的修改並附有解釋:

  1. 創建一Set A[i].size值 - 集合僅包含每個值一次,在您的示例中,filterSet 將包含 (3,4,8) - 這是在 O(n) 中完成的
let filterSet = new Set();
A.forEach(i => filterSet.add(i.size.match(/\d+$/)[0]));
  1. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM