簡體   English   中英

獲取兩個 arrays 之間的精確匹配元素

[英]Getting exact Matching elements between two arrays

我有兩個 arrays 如下:

array1 = [
         {id:1, children: ['a', 'b']},
         {id:2, children: ['a', 'b']},
         {id:3, children: ['b', 'c']},
         {id:4, children: ['c', 'a']},
         {id:5, children: ['a', 'b', 'c']}];

array2 = ['a', 'b'];

現在我想在 JS/TS 中編寫一個代碼,它將從 array1 中找到確切的對象,其中數組 2 中的子數組的每個元素都與數組 1 中的子數組的每個元素完全匹配(順序無關緊要)。

我試圖用三個過濾器來解決這個問題,附加條件是數組 1 和數組 2 之間的子數組長度匹配。 但是,如果這些子數組中至少有一個元素與所需的數組長度相匹配,這也會出現。

如果有人給我解決方案,我將不勝感激。

array1
.filter(a => a.children
.filter(b => array2
.filter(c => b === c)).length === array2.length);

編輯:

在上面的例子中,我實際上已經稍微簡化了這個問題。 在我的實際項目中,這兩個arrays如下:

 const productOrders: ProductOrder[] =
      [
        {
          productId: 1, subProductOrders:
            [{subProduct: {subProductId: 1}}, {subProduct: 
{subProductId: 2}}]
        },
        {
          productId: 1, subProductOrders:
            [{subProduct: {subProductId: 2}}, {subProduct: 
{subProductId: 1}}]
        },
        {
          productId: 1, subProductOrders:
            [{subProduct: {subProductId: 2}}, {subProduct: 
{subProductId: 3}}]
        },
        {
          productId: 1, subProductOrders:
            [{subProduct: {subProductId: 1}}, {subProduct: 
{subProductId: 2}}, {subProduct: {subProductId: 3}}]
        },
      ];

    const matchingCriteria: SubProductOrder[] =
      [
        [{subProduct: {subProductId: 1}}, {subProduct: {subProductId: 
2}}]

      ];

現在我想從 productOrders 數組中查找產品,其中 subProductOrders 數組的 subProductId 與 matchingCriteria 數組的 subProductId 匹配(順序無關緊要)。 在上面的例子中,productOrders 數組的前兩個產品應該匹配,盡管 subProductsIds 是無序的

您可以使用Set並根據此結構檢查子項。

 var array1 = [{ id: 1, children: ['a', 'b'] }, { id: 2, children: ['a', 'b'] }, { id: 3, children: ['b', 'c'] }, { id: 4, children: ['c', 'a'] }, { id: 5, children: ['a', 'b', 'c'] }], array2 = ['a', 'b'], set2 = new Set(array2), result = array1.filter(({ children }) => children.length === set2.size && children.every(Set.prototype.has, set2)); console.log(result);
 .as-console-wrapper { max-height: 100%;important: top; 0; }

對於更復雜的數據結構,您可以解構所需的部分並檢查一組subProductId

 const getId = ({ subProduct: { subProductId } }) => subProductId; var productOrders = [{ productId: 1, subProductOrders: [{ subProduct: { subProductId: 1 } }, { subProduct: { subProductId: 2 } }] }, { productId: 1, subProductOrders: [{ subProduct: { subProductId: 2 } }, { subProduct: { subProductId: 1 } }] }, { productId: 1, subProductOrders: [{ subProduct: { subProductId: 2 } }, { subProduct: { subProductId: 3 } }] }, { productId: 1, subProductOrders: [{ subProduct: { subProductId: 1 } }, { subProduct: { subProductId: 2 } }, { subProduct: { subProductId: 3 } }] }], matchingCriteria = [{ subProduct: { subProductId: 1 } }, { subProduct: { subProductId: 2 } }], set2 = new Set(matchingCriteria.map(getId)), result = productOrders.filter(({ subProductOrders }) => subProductOrders.length === set2.size && subProductOrders.every(o => set2.has(getId(o))) ); console.log(result);
 .as-console-wrapper { max-height: 100%;important: top; 0; }

您可以在單個過濾器中使用Array#every()和 length

 const arr1 = [ {id:1, children: ['a', 'b']}, {id:2, children: ['a', 'b']}, {id:3, children: ['b', 'c']}, {id:4, children: ['c', 'a']}, {id:5, children: ['a', 'b', 'c']} ]; const arr2 = ['a', 'b']; const matched = arr1.filter(({children: c}) => c.length === arr2.length && arr2.every(v => c.includes(v))) console.log(matched)

 array1 = [ {id:1, children: ['a', 'b']}, {id:2, children: ['b', 'a']}, {id:3, children: ['b', 'c']}, {id:4, children: ['c', 'a']}, {id:5, children: ['a', 'b', 'c']}]; array2 = ['a', 'b']; const x = array1.map(a => a.children.sort()).filter(a => a.length === array2.length).map(a => a.sort()).filter(a => JSON.stringify(a)==JSON.stringify(array2)) console.log(x)

您正在根據 element.children 與 array2 的相等性過濾 array1 元素。 所以我鼓勵你看看這些答案 因為它討論了 javascript 中兩個 arrays 的相等性。

並根據您的需要修改以下代碼,這只是可用的最簡單的選項之一:

array1.filter((element,index) => {
      return JSON.stringify(element.children) === JSON.stringify(array2)
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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