Leonardo Gusmão
Leonardo Gusmão

Reputation: 47

Use 2 filter in array java script

I have an array like this

I would like to bring only the installments with checked = true and with payments checked = true

I have this array

 0: {
    checked: true,
    code: 100.
    paymant: Array(2)
    {
        0: {data: 03/12/2021, checked: true},
        1: {data: 03/12/2021}
    }
 },
  1: {
    code: 100.
    paymant: Array(2)
    {
        0: {data: 03/12/2021},
        1: {data: 03/12/2021}
    }
 }

// Real Data
const data = [
    {
        checked: true,
        code: 100,
        payments: [
            {data: 'checked', checked: true},
            {data: 'not-checked'}
        ]
    },
    {
        code: 100,
        payments: [
            {data: 'not-checked'},
            {data: 'not-checked'}
        ]
    }
];

I would like this

0: {
    checked: true,
    code: 100.
    paymant: Array(1)
    {
        0: {data: 03/12/2021, checked: true},
    }
 },

I try to do this but no work

 installments.filter(i => i.checked).filter(i => i.paymant.filter(p => p.checked))

Upvotes: 0

Views: 66

Answers (2)

xdeepakv
xdeepakv

Reputation: 8135

Since you need to mix and match filter and map. You can use reduce here. No need to filter then map, It will cost performance issues.

const data = [
  {
    checked: true,
    code: 100,
    paymant: [
      { data: 03 / 12 / 2021, checked: true },
      { data: 03 / 12 / 2021 },
    ],
  },
  {
    code: 101,
    paymant: [{ data: 03 / 12 / 2021 }, { data: 03 / 12 / 2021 }],
  },
];

const getPaid = (records = []) => {
  return records.reduce((acc, record) => {
    if (!record.checked) return acc;
    const paymant = record.paymant.filter((paymant) => paymant.checked);
    if (paymant.length) {
      acc.push({ ...record, paymant });
    }
    return acc;
  }, []);
};
console.log(getPaid(data));

Upvotes: 1

Bart
Bart

Reputation: 17371

The first filter is straight forward but you'll need to rebuild the payments array so it only contains the checked entry.

const data = [
    {
        checked: true,
        code: 100,
        payments: [
            {data: 'checked', checked: true},
            {data: 'not-checked'}
        ]
    },
    {
        code: 100,
        payments: [
            {data: 'not-checked'},
            {data: 'not-checked'}
        ]
    }
];

const checked = (item) => item && item.checked;
const paymentCheckedMapper = (item) => (
    {...item, payments: item.payments.filter(checked)}
);

data.filter(checked).map(paymentCheckedMapper)

https://jsfiddle.net/vebwfnL0/

Upvotes: 2

Related Questions