通过字段名称减少或映射对象

时间:2021-04-26 10:33:10

标签: javascript

我有一个像:

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

而且看起来很糟糕。无法弄清楚如何以功能方式做到这一点。 就像创建这个对象的对象条目,然后减少它并询问字段,如果它不存在,则深入等

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:-1)

const res = Object.values(obj).reduce((acc, rec) => {
  return [...acc, ...Object.values(rec)]
}, []).map((it) => {
  return typeof it === 'number' ? it : it.map((item) => Object.values(item))
}).reduce((acc, rec) => {
  return typeof rec === 'number' ? [...acc, rec] : [...acc, ...rec]
},[]).reduce((acc, rec) => {
  return typeof rec === 'number' ? [...acc, rec] : [...acc, ...rec]
},[])

相关问题