Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

122
Views
Joining and filtering two data sets

I am currently having difficulties filtering and joining 2 data sets based on various conditions.

The data I am receiving is like so

const ob = {
  "dataOne": [
    {
      "type": "Type 1",
      "name": "failed"
    },
    {
      "type": "Type 1",
      "name": "success"
    },
    {
      "type": "Type 2",
      "name": "success"
    },
    {
      "type": "Type 3",
      "name": "success"
    },
  ],
  "dataTwo": [
    {
      "type": "Type 1",
      "name": "click",
    },
    {
      "type": "Type 2",
      "name": "click",
    },
    {
      "type": "Type 2",
      "name": "click",
    },
    {
      "type": "Type 1",
      "name": "click",
    },
    {
      "type": "Type 3",
      "name": "click",
    },
  ]
};

The result I am after is like so

{
    "type 1" : [
        {
            "count": 2
            "success": 1
            "failed": 1
            "clicks": 2
        }
    ],
    "type 2" : [
        {
            "count": 1
            "success": 1
            "failed": 0
            "clicks": 2
        }
    ],
    "type 3" : [
        {
            "count": 1
            "success": 1
            "failed": 0
            "clicks": 1
        }
    ]
}

So what I am essentially aiming to do is get the unique types from dataOne. I then need the total count of occurrences for each type. Then, I need to know for each type the total count of success and failed.

Then from dataTwo I need to include the number of clicks for each type.

To start things off (not sure if I am going in the right direction here), I have done

const result = ob.dataOne.reduce( (acc, o) => (acc[o.type] = (acc[o.type] || 0)+1, acc), {} );

This will give me the total counts for each type. However, I am not sure how to check the success and failed and format it like above.

Any advice appreciated. I started a JSFiddle

Thanks

about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

I think is easier to concat the two datasets first and then reduce. Here is my code for this:

const ob = {
  "dataOne": [
    {
      "type": "Type 1",
      "name": "failed"
    },
    {
      "type": "Type 1",
      "name": "success"
    },
    {
      "type": "Type 2",
      "name": "success"
    },
    {
      "type": "Type 3",
      "name": "success"
    },
  ],
  "dataTwo": [
    {
      "type": "Type 1",
      "name": "click",
    },
    {
      "type": "Type 2",
      "name": "click",
    },
    {
      "type": "Type 2",
      "name": "click",
    },
    {
      "type": "Type 1",
      "name": "click",
    },
    {
      "type": "Type 3",
      "name": "click",
    },
  ]
};

const concatenatedArrays = ob.dataOne.concat(ob.dataTwo);

const result = concatenatedArrays.reduce((acc, o) => {
  if (!acc[o.type]) {
    acc[o.type] = [{
      "count": 0,
      "success": 0,
      "failed": 0,
      "click": 0,
    }];
  }
  if(o.name == "failed" || o.name == "success"){
    acc[o.type][0]['count'] = (acc[o.type][0]['count'] || 0) + 1;

  }

  acc[o.type][0][o.name] =  acc[o.type][0][o.name] +1

  return acc;
}, {}); 

console.log(result);

EDIT:

Hmm so the count is just for dataOne, changing the code and using reduce twice:

const ob = {
  "dataOne": [
    {
      "type": "Type 1",
      "name": "failed"
    },
    {
      "type": "Type 1",
      "name": "success"
    },
    {
      "type": "Type 2",
      "name": "success"
    },
    {
      "type": "Type 3",
      "name": "success"
    },
  ],
  "dataTwo": [
    {
      "type": "Type 1",
      "name": "click",
    },
    {
      "type": "Type 2",
      "name": "click",
    },
    {
      "type": "Type 2",
      "name": "click",
    },
    {
      "type": "Type 1",
      "name": "click",
    },
    {
      "type": "Type 3",
      "name": "click",
    },
  ]
};

const dataOneReduced = ob.dataOne.reduce((acc, o) => {
  if (!acc[o.type]) {
    acc[o.type] = [
      {
        count: 0,
        success: 0,
        failed: 0,
        click: 0,
      },
    ];
  }

  acc[o.type][0]["count"] = (acc[o.type][0]["count"] || 0) + 1;
  acc[o.type][0][o.name] = acc[o.type][0][o.name] + 1;

  return acc;
}, {});

const result = ob.dataTwo.reduce((acc, o) => {
  acc[o.type][0][o.name] = acc[o.type][0][o.name] + 1;

  return acc;
}, dataOneReduced);

console.log(result);

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!