0

I am trying to combine objects inside an array using reduce my object looks like bellow and has the fallowing structure.

[
    {
        "AREA": [
            "EMAC"
        ],
        "SUPER_REGION": [
            "South East Europe Region",
            "East Europe Region",
        ],
    },
    {
        "AREA": [
            "CCA"
        ],
        "SUPER_REGION": [
            "Taiwan",
            "China Hong Kong"
        ],
    }
    
]

Expected output :

{
        "AREA": [
            "EMAC","CCA"
        ],
        "SUPER_REGION": [
            "South East Europe Region",
            "East Europe Region",
            "Taiwan",
            "China Hong Kong"
        ],
}

My current code using reduce :

let sum = finalval.reduce(function (accumulator, { AREA, SUPER_REGION }) {
    accumulator["AREA"] += AREA;
    return accumulator;
  }, {});

the above code returns me output by combining the values into one string but I want them to be split and added into a single object like shown in expected output. How can i actually push values into these object like we do on arrays using push method ?

4 Answers 4

2

You would need to append elements not only to AREA, but to SUPER_REGION as well - to add elements to an array, use .push, not +=. But that wouldn't be very general. A more flexible approach would construct the output object by first mapping one of the input objects, with empty arrays as values - then for each input object, iterate over each subarray and push to the key in the output object.

const input = [
    {
        "AREA": [
            "EMAC"
        ],
        "SUPER_REGION": [
            "South East Europe Region",
            "East Europe Region",
        ],
    },
    {
        "AREA": [
            "CCA"
        ],
        "SUPER_REGION": [
            "Taiwan",
            "China Hong Kong"
        ],
    }  
];

const output = Object.fromEntries(
  Object.keys(input[0]).map(key => [key, []])
);
for (const obj of input) {
  for (const [key, subarr] of Object.entries(obj)) {
    output[key].push(...subarr);
  }
}
console.log(output);

.reduce isn't really appropriate here, assuming you want to keep the input unmutated. If you have to use .reduce, it will look a bit confusing for no good reason.

const input = [{
    "AREA": [
      "EMAC"
    ],
    "SUPER_REGION": [
      "South East Europe Region",
      "East Europe Region",
    ],
  },
  {
    "AREA": [
      "CCA"
    ],
    "SUPER_REGION": [
      "Taiwan",
      "China Hong Kong"
    ],
  }
];

const output = input.reduce((a, obj) => {
  for (const [key, subarr] of Object.entries(obj)) {
    a[key].push(...subarr);
  }
  return a;
}, Object.fromEntries(Object.keys(input[0]).map(key => [key, []])));
console.log(output);

Sign up to request clarification or add additional context in comments.

Comments

2

const d = [{"AREA":["EMAC"],"SUPER_REGION":["South East Europe Region","East Europe Region"]},{"AREA":["CCA"],"SUPER_REGION":["Taiwan","China Hong Kong"]}]

const r = d.reduce((a,c)=>(Object.keys(c).forEach(k=>a[k].push(...c[k])),a))

console.log(r)

Comments

0

You can achieve this requirement by using Array.reduce() method.

Live Demo :

const arr = [
  {
    "AREA": [
      "EMAC"
    ],
    "SUPER_REGION": [
      "South East Europe Region",
      "East Europe Region",
    ],
  },
  {
    "AREA": [
      "CCA"
    ],
    "SUPER_REGION": [
      "Taiwan",
      "China Hong Kong"
    ],
  }
];

const res = arr.reduce((obj, curr) => {
    Object.keys(curr).forEach(key => {
    obj[key] = obj[key] ? [...obj[key], ...curr[key]] : curr[key]
  })
  return obj
}, {});

console.log(res);

Comments

0

You could merge the arrays from all the objects in the input.

Something along the lines of the code below:

let finalVal = [{
    "AREA": [
      "EMAC"
    ],
    "SUPER_REGION": [
      "South East Europe Region",
      "East Europe Region",
    ],
  },
  {
    "AREA": [
      "CCA"
    ],
    "SUPER_REGION": [
      "Taiwan",
      "China Hong Kong"
    ],
  }
];


function collecItems(prev, curr) {
  // to make it more generic, get the keys from the first element in the array:
  let objectKeys = Object.keys(finalVal[0]);
  console.log(objectKeys);

  // build the object with the keys
  let rtnObj = {};

  objectKeys.forEach(key => {
    // add the values for each key
    rtnObj[key] = [...prev[key], ...curr[key]];
  });
  return rtnObj;
}

let sum = finalVal.reduce(collecItems);

console.log(sum);

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.