Combine arrays from values in array of objects?

Viewed 49

I have an array that contains a bunch of objects:

let sample = [
  {
    name: 'obj1',
    values: ["value1", "value2"]
  },
  {
    name: 'obj2',
    values: ["value3", "value4"]
  },
  {
    name: 'obj3',
    values: ["value5", "value6"]
  }
]

I need to combine all the arrays on the objects to end up with something like this:

let outputArray = ["value1", "value2", "value3", "value4", "value5", "value6"]

Cant seem to find the best way to do this. Thank you.

5 Answers

You could use Array.flatMap to first map each object to its values array, and then flatten the result:

let sample = [
  {
    name: 'obj1',
    values: ["value1", "value2"]
  },
  {
    name: 'obj2',
    values: ["value3", "value4"]
  },
  {
    name: 'obj3',
    values: ["value5", "value6"]
  }
]

let outputArray = sample.flatMap(o => o.values);
console.log(outputArray);

In addition to Nick's answer, you can also use the reduce function for a wider range of support in different environments if you are not using tools like babel.

let sample = [
  {
    name: 'obj1',
    values: ["value1", "value2"]
  },
  {
    name: 'obj2',
    values: ["value3", "value4"]
  },
  {
    name: 'obj3',
    values: ["value5", "value6"]
  }
]

const result = sample.reduce((acc, item) => {
  return [...acc, ...item.values];
}, []);

console.log(result);

You could use Array.reduce along with Array.concat:

let sample = [
  {
    name: 'obj1',
    values: ["value1", "value2"]
  },
  {
    name: 'obj2',
    values: ["value3", "value4"]
  },
  {
    name: 'obj3',
    values: ["value5", "value6"]
  }
];

let valuesArray = sample.reduce((a, b) => a.concat(b['values']), []);
console.log(valuesArray);

I think what you want to employ is the array concat() method. This method does not change the existing arrays, but returns a new array, containing the values of the joined arrays.

My proposed solution:

const outputArray = sample[0].values.concat(sample[1].values, sample[2].values);
let outputArray=[]  
sample.forEach(item=> { outputArray.push(item.values.map(val=> val)) })
Related