1

I am facing one problem when I want to filter an array inside an array by an array. Please see the example-

const array1 = [
    {
        name: "this is name1",
        products: [
            { id: "4" },
            { id: "2" },
        ]
    },
    {
        name: "this is name2",
        products: [
            { id: "2" },
            { id: "1" }
        ]
    }
]

const array2 = [
    { id: "1", refund: true },
    { id: "2", refund: false },
    { id: "3", refund: true },
    { id: "4", refund: false}
]

Here I have to filter array1 products field. Here in array1 products filed an array with of id. I have to filter this products field by searching same object from array2 by id and then filter when refund is true.

From the example I need result by this-

const array1 = [
    {
        name: "this is name2",
        products: [
            { id: "1" }
        ]
    }
]

Here in result we can see only one object in this array. Because from array1, in the object's product filed have two id 4 and 2. From array2 we can see refund false for both id 4 and 2. That's why array1 remove first object.

In the second object we can see products field contain two id 2 and 1. From array2 we can see refund is false for id 2 but refund is true for id 1. Hence for id 1 refund is true that's why it stay in products array.

Please help me. I hope I can clear my questions.

1
  • What is the problem? Commented Nov 19, 2022 at 15:40

2 Answers 2

2

You can use a combination of array methods like filter, map & reduce to get the result.

const array1 = [
  {
    name: 'this is name1',
    products: [{ id: '4' }, { id: '2' }],
  },
  {
    name: 'this is name2',
    products: [{ id: '2' }, { id: '1' }],
  },
];

const array2 = [
  { id: '1', refund: true },
  { id: '2', refund: false },
  { id: '3', refund: true },
  { id: '4', refund: false },
];

// Transforms array2 to { 1: { id: 1, refund: true }, 2: ...}  
const array2ToMap = array2.reduce((map, item) => {
    map[item.id] = item
    return map
}, new Map());

const result = array1
  .map(item => {
    // Filters only the products that have refund as `true`
    const filteredProducts = item.products.filter(
      product => array2ToMap[product.id]?.refund
    );
    return { ...item, products: filteredProducts };
  })
  // Only select items which have at least 1 filtered products
  .filter(item => item.products.length > 0);

console.log(result);

Sign up to request clarification or add additional context in comments.

1 Comment

Hello, I update my question for doing one more things. Can you update your answer.
0

const array1 = [{"name":"this is name1","products":[{"id":"4"},{"id":"2"}]},{"name":"this is name2","products":[{"id":"2"},{"id":"1"}]}];
const array2 = [{"id":"1","refund":true},{"id":"2","refund":false},{"id":"3","refund":true},{"id":"4","refund":false}];

const refundIds = array2.filter(i=>i.refund).map(i=>i.id);
const intersect = (a,b) => a.some(i=>b.includes(i));

console.log(array1.filter(e=>
  intersect(refundIds, e.products.map(i=>i.id)))
  .map(({products, ...a})=>({...a,
    products: products.filter(i=>refundIds.includes(i.id))
  }))
);

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.