Javascript虚线对象键到对象

Ang*_* Ab 5 javascript lodash

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

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

{
  "property": "personal_info.address.city",
  "description": "Missing field"
},
{
  "property": "personal_info.address.country",
  "description": "Missing field"
},
Run Code Online (Sandbox Code Playgroud)

所以我实现了这个:

{
    '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;
})
Run Code Online (Sandbox Code Playgroud)

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

{
    personal_info: {
        address: {
            city: 'Missing field',
            country: 'Missing field',
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

但我被卡住了,因为我正在更改密钥本身。

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

Nin*_*olz 8

你可以_.set从 lodash使用。

将值设置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);
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>
Run Code Online (Sandbox Code Playgroud)


Nen*_*car 5

您可以使用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)
Run Code Online (Sandbox Code Playgroud)