Search code examples
javascriptarraysobject

Return multiple arrays of flat data while running Map on object array


I am trying to extract multiple flat arrays of values from an object array.

I'm able to extract the values needed using ES6 Map, but I'd like to separate these values into individual arrays without having to loop multiple times.

Here is my attempt so far:

    let list = [
        {
            "name": "namee 1",
            "type": "type 1",
            "deal_type": "dealtype1"
        },
        {
            "name": "namee 2",
            "type": "type 2",
            "deal_type": "dealtype2"
        },
        {
            "name": "namee 3",
            "type": "type 3",
            "deal_type": "dealtype3"
        },
        {
            "name": "namee 1",
            "type": "type 1",
            "deal_type": "dealtype1"
        }
    ]

  const summary = test.map(item => ({ deal_type: item.deal_type, type: item.type}));

The desired outcome would be the following output from one .Map loop:

type = ["type 1", "type 2", "type 3"] 
deal_type = ["dealtype1", "dealtype2", "dealtype3"]

Solution

  • You can achieve it with reduce instead of map using an array:

    let list = [{"name": "namee 1","type": "type 1","deal_type": "dealtype1"},{"name": "namee 2","type": "type 2","deal_type": "dealtype2"},{"name": "namee 3","type": "type 3","deal_type": "dealtype3"},{"name": "namee 1","type": "type 1","deal_type": "dealtype1"}];
    
    const [type, deal_type] = list.reduce((acc, el) => (
      acc[0].push(el.type),
      acc[1].push(el.deal_type),
      acc
    ), [[], []]);
    console.log(type);
    console.log(deal_type);

    or more verbose using an object

    let list = [{"name": "namee 1","type": "type 1","deal_type": "dealtype1"},{"name": "namee 2","type": "type 2","deal_type": "dealtype2"},{"name": "namee 3","type": "type 3","deal_type": "dealtype3"},{"name": "namee 1","type": "type 1","deal_type": "dealtype1"}];
    
    const { type, deal_type } = list.reduce((acc, el) => (
      acc.type.push(el.type),
      acc.deal_type.push(el.deal_type),
      acc
    ), { type: [], deal_type: [] });
    console.log(type);
    console.log(deal_type);

    or if you want to remove duplicates:

    let list = [{"name": "namee 1","type": "type 1","deal_type": "dealtype1"},{"name": "namee 2","type": "type 2","deal_type": "dealtype2"},{"name": "namee 3","type": "type 3","deal_type": "dealtype3"},{"name": "namee 1","type": "type 1","deal_type": "dealtype1"}];
    
    const [type, deal_type] = list.reduce((acc, el) => (
      acc[0].add(el.type),
      acc[1].add(el.deal_type),
      acc
    ), [new Set(), new Set()]).map(el => [...el]);
    console.log(type);
    console.log(deal_type);