Home > Software engineering >  How to reduce an array of objects inside an array of objects based on another array
How to reduce an array of objects inside an array of objects based on another array

Time:02-01

Is array reduce the best option for this or any other better options like using lodash

For eg:- The array that needs to be reduced

let A1 = [
    {
    "id": 1,
    "agency": "Sel A.",
    "analysis": [
        {"quarter": "Q4"," comment": "Test Data 1"},
        {"quarter": "Q3", "comment": "Test Data 2"},
        {"quarter": "Q2", "comment": "Test Data 3"}]
    },
    {
    "id": 2,
    "agency": "Sel B.",
    "analysis": [
        {"quarter": "Q1", "comment": "Test Data 4"},
        {"quarter": "Q3", "comment": "Test Data 5"},
        {"quarter": "Q4", "comment": "Test Data 6"}]
    },
    {
    "id": 3,
    "agency": "Sel C.",
    "analysis": [
        {"quarter": "Q2", "comment": "Test Data 7"},
        {"quarter": "Q3", "comment": "Test Data 8"},
        {"quarter": "Q4", "comment": "Test Data 9"}]
    },
    {
    "id": 4,
    "agency": "Sel D.",
    "analysis": [
        {"quarter": "Q1", "comment": "Test Data 10"},
        {"quarter": "Q4", "comment": ""},
        {"quarter": "Q3", "comment": "Test Data 12"}]
    }
];

The array with which we get the filter

let A2 = ['Q3', Q4];

How to reduce array like below where it only filter 'Q3' and 'Q4' and also check if comment is not empty.

let res = [
    {
    "id": 1,
    "agency": "Sel A.",
    "analysis": [
        {"quarter": "Q4"," comment": "Test Data 1"},
        {"quarter": "Q3", "comment": "Test Data 2"}],
    },
    {
    "id": 2,
    "agency": "Sel B.",
    "analysis": [,
        {"quarter": "Q3", "comment": "Test Data 5"},
        {"quarter": "Q4", "comment": "Test Data 6"}]
    },
    {
    "id": 3,
    "agency": "Sel C.",
    "analysis": [
        {"quarter": "Q3", "comment": "Test Data 8"},
        {"quarter": "Q4", "comment": "Test Data 9"}]
    },
    {
    "id": 4,
    "agency": "Sel D.",
    "analysis": [
        {"quarter": "Q3", "comment": "Test Data 12"}]
    }
]

CodePudding user response:

The tricky part is that the filter happens on a inner level

let A1 = [
    {
    "id": 1,
    "agency": "Sel A.",
    "analysis": [
        {"quarter": "Q4"," comment": "Test Data 1"},
        {"quarter": "Q3", "comment": "Test Data 2"},
        {"quarter": "Q2", "comment": "Test Data 3"}]
    },
    {
    "id": 2,
    "agency": "Sel B.",
    "analysis": [
        {"quarter": "Q1", "comment": "Test Data 4"},
        {"quarter": "Q3", "comment": "Test Data 5"},
        {"quarter": "Q4", "comment": "Test Data 6"}]
    },
    {
    "id": 3,
    "agency": "Sel C.",
    "analysis": [
        {"quarter": "Q2", "comment": "Test Data 7"},
        {"quarter": "Q3", "comment": "Test Data 8"},
        {"quarter": "Q4", "comment": "Test Data 9"}]
    },
    {
    "id": 4,
    "agency": "Sel D.",
    "analysis": [
        {"quarter": "Q1", "comment": "Test Data 10"},
        {"quarter": "Q4", "comment": ""},
        {"quarter": "Q3", "comment": "Test Data 12"}]
    }
];

let A2 = ['Q3','Q4'];


const res = A1.map( x => {
  const {analysis,...rest} = x
  return {
  analysis: analysis.filter(q => A2.includes(q.quarter) && q.comment ),
  ...rest
  }
  });
  
  console.log(res)

CodePudding user response:

You don't need to use reduce nor lodash, you can just use forEach on A1 and then use filter on analysis

let A1 = [{
    "id": 1,
    "agency": "Sel A.",
    "analysis": [{
        "quarter": "Q4",
        "comment": "Test Data 1"
      },
      {
        "quarter": "Q3",
        "comment": "Test Data 2"
      },
      {
        "quarter": "Q2",
        "comment": "Test Data 3"
      }
    ]
  },
  {
    "id": 2,
    "agency": "Sel B.",
    "analysis": [{
        "quarter": "Q1",
        "comment": "Test Data 4"
      },
      {
        "quarter": "Q3",
        "comment": "Test Data 5"
      },
      {
        "quarter": "Q4",
        "comment": "Test Data 6"
      }
    ]
  },
  {
    "id": 3,
    "agency": "Sel C.",
    "analysis": [{
        "quarter": "Q2",
        "comment": "Test Data 7"
      },
      {
        "quarter": "Q3",
        "comment": "Test Data 8"
      },
      {
        "quarter": "Q4",
        "comment": "Test Data 9"
      }
    ]
  },
  {
    "id": 4,
    "agency": "Sel D.",
    "analysis": [{
        "quarter": "Q1",
        "comment": "Test Data 10"
      },
      {
        "quarter": "Q4",
        "comment": ""
      },
      {
        "quarter": "Q3",
        "comment": "Test Data 12"
      }
    ]
  }
];

let A2 = ['Q3', 'Q4'];

A1.forEach(item => item.analysis = item.analysis.filter(analysis =>
  A2.includes(analysis.quarter) && analysis.comment
))

console.log(A1)

CodePudding user response:

Below implementation is using lodash library

let A1 = [{
    "id": 1,
    "agency": "Sel A.",
    "analysis": [{
        "quarter": "Q4",
        " comment": "Test Data 1"
      },
      {
        "quarter": "Q3",
        "comment": "Test Data 2"
      },
      {
        "quarter": "Q2",
        "comment": "Test Data 3"
      }
    ]
  },
  {
    "id": 2,
    "agency": "Sel B.",
    "analysis": [{
        "quarter": "Q1",
        "comment": "Test Data 4"
      },
      {
        "quarter": "Q3",
        "comment": "Test Data 5"
      },
      {
        "quarter": "Q4",
        "comment": "Test Data 6"
      }
    ]
  },
  {
    "id": 3,
    "agency": "Sel C.",
    "analysis": [{
        "quarter": "Q2",
        "comment": "Test Data 7"
      },
      {
        "quarter": "Q3",
        "comment": "Test Data 8"
      },
      {
        "quarter": "Q4",
        "comment": "Test Data 9"
      }
    ]
  },
  {
    "id": 4,
    "agency": "Sel D.",
    "analysis": [{
        "quarter": "Q1",
        "comment": "Test Data 10"
      },
      {
        "quarter": "Q4",
        "comment": ""
      },
      {
        "quarter": "Q3",
        "comment": "Test Data 12"
      }
    ]
  }
];

let A2 = ['Q3', 'Q4'];

var result = _.map(A1, x => {
  x.analysis = _.filter(x.analysis, analysisChild => A2.includes(analysisChild.quarter));
  return x;
});
console.log(result);
<script src="https://cdn.jsdelivr.net/npm/[email protected]/lodash.min.js" integrity="sha256-qXBd/EfAdjOA2FGrGAG b3YBn2tn5A6bhz LSgYD96k=" crossorigin="anonymous"></script>

  •  Tags:  
  • Related