1

I have a 2D array where the outer array contains objects, each of which contains another array of objects. Here is the data:

const companies = [{
    companyId: 100,
    companyName: "Company 1",
    transactions: [
      { id: "10421", date: "09/19/2022", selected: true, },
      { id: "00467", date: "05/08/2022", selected: true, },
    ],
  },
  {
    companyId: 200,
    companyName: "Company 2",
    transactions: [
      { id: "259A6", date: "01/11/2022", selected: false, },
      { id: "87K37", date: "04/14/2022", selected: false, },
    ],
  },
];

I want to get the list of transactions that have their selected fields set to true. This is how I am filtering the data:

const selectedTransactions = companies.filter((c) =>
  c.transactions.filter((t) => t.selected === true));

Instead of getting the transactions of only the first company, I'm getting the transactions of ALL companies, including the ones that are not selected. Am I making a mistake somewhere?

2 Answers 2

2

You could flat-map the overall companies; then internally filter and map the transaction IDs and dates along with the company ID.

const companies = [{
  companyId: 100,
  companyName: "Company 1",
  transactions: [
    { id: "10421", date: "09/19/2022", selected: true },
    { id: "00467", date: "05/08/2022", selected: true },
  ],
}, {
  companyId: 200,
  companyName: "Company 2",
  transactions: [
    { id: "259A6", date: "01/11/2022", selected: false },
    { id: "87K37", date: "04/14/2022", selected: false },
  ],
}];

const selected = companies
  .flatMap(({ companyId, transactions }) => transactions
    .filter(({ selected }) => selected)
    .map(({ id: transactionId, date: transactionDate }) =>
      ({ companyId, transactionId, transactionDate })));

console.log(selected);
.as-console-wrapper { top: 0; max-height: 100% !important; }

Result

[
  { "companyId": 100, "transactionId": "10421", "transactionDate": "09/19/2022" },
  { "companyId": 100, "transactionId": "00467", "transactionDate": "05/08/2022" }
]
Sign up to request clarification or add additional context in comments.

1 Comment

Nice usage of flatMap() and destructuring! Thanks for sharing +1
0

If youre just looking for the transactions you could use map, though it does return a second empty array. Or just add a little to your filter function to get only the company with what youre looking for.

const companies = [{
  companyId: 100,
  companyName: "Company 1",
  transactions: [
    { id: "10421", date: "09/19/2022", selected: true },
    { id: "00467", date: "05/08/2022", selected: true },
  ],
}, {
  companyId: 200,
  companyName: "Company 2",
  transactions: [
    { id: "259A6", date: "01/11/2022", selected: false },
    { id: "87K37", date: "04/14/2022", selected: false },
  ],
}];

// USING MAP TO GET TRANSACTIONS
const st = companies.map(c => c.transactions.filter(t => t.selected === true))

console.log(st);

// USING FILTER TO GET COMPANY
const selectedTransactions = companies.filter(c => {
  c.transactions = c.transactions.filter(t => t.selected === true); 
  if (c.transactions.length) return c;
});

console.log(selectedTransactions);
.as-console-wrapper { top: 0; max-height: 100% !important; }

Result

1
[
  [
    {
      "id": "10421",
      "date": "09/19/2022",
      "selected": true
    },
    {
      "id": "00467",
      "date": "05/08/2022",
      "selected": true
    }
  ],
  []
]

2
[
  {
    "companyId": 100,
    "companyName": "Company 1",
    "transactions": [
      {
        "id": "10421",
        "date": "09/19/2022",
        "selected": true
      },
      {
        "id": "00467",
        "date": "05/08/2022",
        "selected": true
      }
    ]
  }
]

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.