0

I have next object:

const types = {
  sometypes: {
    TYPE1: { name: 'type1', value: '1' },
    TYPE2: { name: 'type2', value: '2' },
    TYPE3: { name: 'type3', value: '3' },
  },
  TYPE4: { name: 'type4' },
};

how can I extract all name fields? Expected result: ['type1','type2','type3','type4']

Ted
  • 1,682
  • 3
  • 25
  • 52

3 Answers3

1

You can create a recursive function to loop through the object.

const types = {
  sometypes: {
    TYPE1: {
      name: 'type1',
      value: '1'
    },
    TYPE2: {
      name: 'type2',
      value: '2'
    },
    TYPE3: {
      name: 'type3',
      value: '3'
    },
  },
  TYPE4: {
    name: 'type4'
  },
};


function extractNames(obj) {
  let result = [];
  Object.keys(obj).forEach(k => {
    if (k == 'name') {
      result.push(obj[k]);
    } else if (typeof obj[k] == 'object') {
      result.push(...extractNames(obj[k]));
    }
  });

  return result;
}

console.log(extractNames(types));
Kalimah
  • 11,217
  • 11
  • 43
  • 80
0

Take entries of object and then map it accordingly.(I'm assuming your object is not nested)

var types = { sometypes: { TYPE1: { name: 'type1', value: '1' }, TYPE2: { name: 'type2', value: '2' }, TYPE3: { name: 'type3', value: '3' }, }, TYPE4: { name: 'type4' },};

var result = Object.entries(types).flatMap(([k,v])=> v.name ? v.name : Object.values(v).map(({name})=>name));

console.log(result);
gorak
  • 5,233
  • 1
  • 7
  • 19
0

This getNames function does it recursively.

const types = getSourceObject();

function getNames(obj, names){
  const keys = Object.keys(obj);
  keys.forEach( (key) => {
    if(obj[key].name){ names.push(obj[key].name); }
    else{ getNames(obj[key], names); }
  });
}

const namesArr = [];
getNames(types, namesArr);
console.log(namesArr);

function getSourceObject(){
  return {
    sometypes: {
      TYPE1: { name: 'type1', value: '1' },
      TYPE2: { name: 'type2', value: '2' },
      TYPE3: { name: 'type3', value: '3' }
    },
    TYPE4: { name: 'type4' }
  };
}
Cat
  • 4,141
  • 2
  • 10
  • 18