如何将带点的键转换为 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
但我被卡住了,因为我正在更改密钥本身。
编辑:更改了测试城市和测试国家以反映描述字段(抱歉)
你可以_.set从 lodash使用。
将值设置
path为object。如果 的一部分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)
您可以使用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)
| 归档时间: |
|
| 查看次数: |
3984 次 |
| 最近记录: |