【问题标题】:Javascript dotted object keys to objectJavascript点缀对象键到对象
【发布时间】:2018-03-15 14:58:29
【问题描述】:

如何将点键转换为 javascript 对象并保留其值?

所以我从一个 API 得到了这种响应,我需要通过 key 解析它:value。

{
  "property": "personal_info.address.city",
  "description": "Missing field"
},
{
  "property": "personal_info.address.country",
  "description": "Missing field"
},

所以我做到了:

{
    'personal_info.address.city': 'Missing field',
    'personal_info.address.country': 'Missing field'
}

// by using this code (lodash)

_.mapValues(_.keyBy(obj, 'property'), function(o) {
  return o.description;
})

但是,我需要它是这样的:

{
    personal_info: {
        address: {
            city: 'Missing field',
            country: 'Missing field',
        }
    }
}

我以某种方式在 stackoverflow 中搜索了如何将点符号字符串转换为对象: Convert string with dot notation to JSON

但由于我要更改密钥本身,所以我被卡住了。

编辑: 更改了测试城市和测试国家以反映描述字段(对不起)

【问题讨论】:

  • 为什么country 没有嵌套在address 中? country 中的city 来自哪里?你如何从Missing fieldtest city?请更准确。
  • @str 我的错误,一开始我没有注意到。我已经编辑了我的问题。谢谢!

标签: javascript lodash


【解决方案1】:

您可以使用来自 lodash 的 _.set

将值设置为pathobject。如果path 的一部分不存在,则会创建它。为缺少的索引属性创建数组,而为所有其他缺少的属性创建对象。使用_.setWith 自定义路径创建。

var array = [{ property: "personal_info.address.city", description: "Missing field" }, { property: "personal_info.address.country", description: "Missing field" }],
    object = array.reduce((o, { property, description }) => _.set(o, property, description), {});

console.log(object);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>

【讨论】:

    【解决方案2】:

    您可以使用forEach() 循环和内部reduce() 方法来获得这样的结果。

    const data = [{"property": "personal_info.address.city","description": "Missing field"},{"property": "personal_info.address.country","description": "Missing field"}]
    
    const result = {}
    data.forEach(function(o) {
      o.property.split('.').reduce(function(r, e, i, arr) {
        return r[e] = (r[e] || (arr[i + 1] ? {} : o.description))
      }, result)
    })
    
    console.log(result)

    【讨论】:

    • 那不使用description属性。
    • 发帖者使用的是lodash,在这里重新发明轮子几乎没有意义。
    • 谢谢! sn-p 有效,但由于我使用的是 lodash,因此我接受了 Nina 的解决方案。对所有人来说,这适用于没有 lodash 的人。只需将'test ' + e 更改为o.description
    猜你喜欢
    • 1970-01-01
    • 2019-01-30
    • 2014-11-28
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 2022-07-06
    • 2015-02-28
    • 2012-03-22
    相关资源
    最近更新 更多