首页 > 解决方案 > 按字段名称减少或映射对象

问题描述

我有一个像这样的对象:

const obj = {
  obj2: { 
    number: 123123,
    obj3: [{
      number: 321321
    }, {
      number: 543543
    }]
  },
  obj5: { 
    number: 52343,
    obj6: [{
      number: 753456
    }, {
      number: 12312
    }]
 },
}

想要的输出:[123123, 321321, 543543, 52343, 753456, 12312]

我解决它的方法只是..创建一个像

[obj2.number, obj2.obj3[0].number, obj5.number, obj5.obj6[0].number].find(el => Boolean(el))

它看起来很糟糕。无法弄清楚如何以功能方式进行操作。就像制作这个对象的对象条目,然后减少它并询问字段,如果它不存在,则更深入等。

或名为“数字”的字段中的第一个值不为空(布尔值 true)

标签: javascript

解决方案


不是一种花哨的方式,也不能保证适用于每种情况,但您可以从这里开始

const obj = {
  obj2: { 
    number: 123123,
    obj3: [{
      number: 321321
    }, {
      number: 543543
    }]
  },
  obj5: { 
    number: 52343,
    obj6: [{
      number: 753456
    }, {
      number: 12312
    }]
 },
}

getPropValues = function(obj, name) {
 let result = [];
 
 if(Array.isArray(obj)) {
   for(let i =0;i<obj.length;++i) {
      let innerResult = getPropValues(obj[i],name);
      result = result.concat(innerResult);
   }
   return result;
 }

 if(typeof obj === 'object') {
   for (const [key, value] of Object.entries(obj)) {
      if(key === name) {
         result.push(value);
      } else if(Array.isArray(value) || typeof value === 'object') {
         result = result.concat(getPropValues(value,name));
      }
   }
 }
 return result;
}

console.log(getPropValues(obj,'number'))


推荐阅读