【问题标题】:How to flatten objects in JavaScript (with or without lodash)?如何在 JavaScript 中展平对象(有或没有 lodash)?
【发布时间】:2019-07-15 08:46:24
【问题描述】:

我有一个类似的对象

farmer:{
  name: "First Name",
  bank: {
    id: 7
  }
  certifications: [
   {
    certificateNumber: {
     id : 7
    },
    certificateNumber: {
     id : 8
    }  
   }
  ]
}

我尝试过使用 lodash 的 set 和 unset 方法,但这经常导致未定义的值。我想从上面的对象中完全删除 id 键

这就是我想要的结果

farmer:{
  name: "First Name",
  bank: 7
  certifications: [
   {
    certificateNumber: 7,
    certificateNumber: 8 
   }
  ]
}

【问题讨论】:

  • 一个对象不能有重复的键(所以你输入的数据类型和预期结果无效)
  • @NickParsons 实际上并非无效。只是后面的键会覆盖前者。 { a: 1, a: 2, a: 3 } 产生 { a: 3 }
  • 为什么认证是一个包含单个对象的数组?
  • @max 啊,你是对的,我想我应该说它“没有多大意义”而不是“无效”:)
  • @J. Stoll 这就是我通过查询从数据库中获取它的方式,当我进行突变时,我需要删除对象并直接发送 id

标签: javascript reactjs lodash


【解决方案1】:

可以使用lodash的_.transform()递归迭代结构,如果一个对象有id属性,并且它的大小(属性数)为1,则将该对象替换为id值。

注意:certifications 数组格式错误,已更改为以下格式 [{certificateNumber:{id:7}},{certificateNumber:{id:8}}]

const fn = obj => _.transform(obj, (accumulator, value, key) => {
  let val = value

  if(_.has(value, 'id') && _.size(value) === 1) val = _.get(value, 'id')
  else if(_.isObject(value)) val = fn(value)

  accumulator[key] = val
})

const farmer = {"name":"First Name","bank":{"id":7},"certifications":[{"certificateNumber":{"id":7}},{"certificateNumber":{"id":8}}]}

const result = fn(farmer)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.14/lodash.js"></script>

【讨论】:

    猜你喜欢
    • 2016-06-20
    • 2020-09-05
    • 2017-10-19
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    • 2016-10-30
    相关资源
    最近更新 更多