【问题标题】:How to return array of objects from multidimensional object?如何从多维对象返回对象数组?
【发布时间】:2022-01-13 16:23:05
【问题描述】:

我有对象:

const salary = {
   netto: {
      min: '700.',
      max: '',
   },
   brutto: {
      min: '',
      max: '',
   },
}

我想遍历对象并返回看起来像 [{name: 'netto_min', value: '700'},...etc] 跳过具有空值的键的对象数组。

我试过了:

const result = Object.keys(salary).map(type => 
   Object.keys(salary[type]).map(entry => {
      if(salary[type][entry] !== ''){
         return {name: `${type}_${entry}`, value: parseInt(salary[type][entry]).toString()}
      }
   })
)

它吸引了我:[[{name: 'netto_min', value: '700'}, undefined],[undefined, undefined]] 我怎样才能得到[{name: 'netto_min', value: '700'}]

【问题讨论】:

  • 在value值中你设置了min的值吗?
  • 是的,已修复。想法是遍历所有值,如果它们存在,则将它们作为对象数组的一部分返回。但是第二个地图创建了第二个数组,我没想到,所以不知道如何达到我想要的结果。

标签: javascript ecmascript-6


【解决方案1】:
const salary = {
  netto: {
    min: "700.",
    max: ""
  },
  brutto: {
    min: "",
    max: ""
  }
};
let result = Object.keys(salary).map(k => {
  return Object.keys(salary[k]).map(r => ({
     name: `${k}_${r}`,
     value: parseInt(salary[k][r])
    }))
}).flat().filter( b => !isNaN(b.value))

返回

[ { name: 'netto_min', value: 700 } ]

我假设700.700 上的拼写错误,很容易被删除

【讨论】:

  • 这不是错误,它是需要通过parseInt的可接受值之一
  • @Alyona,知道了,更新了
【解决方案2】:

你可以这样做:

const salary = {
  netto: {
    min: '700.',
    max: '',
  },
  brutto: {
    min: '',
    max: '',
  },
}

let result = []

for (type in salary) {
  for (entry in salary[type]) {
    let obj = {}
    let value = salary[type][entry]

    if (value) {
      obj.name = `${type}_${entry}`
      obj.value = parseInt(value).toString()

      result.push(obj)
    }
  }
}

console.log(result)

【讨论】:

    【解决方案3】:

    我想这就是你需要的。试试这个方法:

    const result = [];
    
    Object.entries(salary).map(entry => {
        const prefix = entry[0];
        const props = Object.entries(entry[1])
        .filter(prop => !!prop[1])
        .map(prop => ({
            name: `${prefix}_${prop[0]}`,
            value: prop[1],
        }));
    
        result.push(...props);
    });
    

    【讨论】:

      【解决方案4】:

      获取键,然后根据该键是否为非空来过滤该数组。然后遍历,并将其推送到数组并返回。

      const salary = {
        netto: {
          min: '700.',
          max: '',
        },
        brutto: {
          min: '',
          max: '',
        },
      };
      
      var non_empty_salaries = Object.keys(salary).map(name => {
        var keys = Object.keys(salary[name]);
        var non_empty = keys.filter(key => salary[name][key] != '');
        var non_emptys = [];
        for (let key of non_empty) {
          non_emptys.push({
            name: `${name}_${key}`,
            value: salary[name][key]
          });
        }
        return non_emptys;
      });
      console.log(non_empty_salaries);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-29
        • 1970-01-01
        • 1970-01-01
        • 2012-01-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多