从对象中提取参数

时间:2020-06-16 10:41:46

标签: javascript

我有下一个对象:

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

如何提取所有name字段? 预期结果:['type1','type2','type3','type4']

3 个答案:

答案 0 :(得分:1)

您可以创建一个递归函数来遍历对象。

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));

答案 1 :(得分:0)

获取entries个对象,然后进行相应的映射。(我假设您的对象未嵌套)

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);

答案 2 :(得分:0)

getNames函数以递归方式进行。

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' }
  };
}