【问题标题】:Extract parameters from object从对象中提取参数
【发布时间】:2020-06-16 10:41:46
【问题描述】:

我有下一个对象:

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']

【问题讨论】:

  • 展示您的期望。
  • 使用递归函数遍历你的对象

标签: javascript


【解决方案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));

【讨论】:

  • 我会简化为 result.push(...extractNames(obj[k])); :-)
【解决方案2】:

获取对象的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);

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2016-11-21
      • 2019-07-15
      • 2019-06-15
      • 2018-06-30
      • 2019-08-04
      • 1970-01-01
      • 2014-11-10
      • 2019-04-09
      • 2019-03-22
      相关资源
      最近更新 更多