javascript - Javascript | 通过点符号映射到对象
问题描述
我目前有一个字符串,如下所示author.id
。
基本上我想要做的就是将此字符串转换为一个对象。第一个成为关系,最后一个成为属性。然而,该列表实际上可能会变得更长,例如:
author.sites.id
然后它将成为以下对象:
{
author: {
relationships: {
sites: {
attributes: {
id: 1
}
}
}
}
}
对象上总会有一个顶级属性,relationships
因为这是这样做的目的,将其映射到 JSON API Spec POST 请求。
因此, 的示例author.id
将生成具有以下属性的对象:
{
relationships: {
author: {
attributes: {
id:
}
}
}
}
所以基本上所有被 分割的属性都.
应该嵌套在 的父属性中relationships
,最后一个应该总是attributes
.
我知道您可能会为此使用 reduce ,并且我根据 Stack Overflow 上的其他问题创建了以下函数,但它没有正确地进行嵌套,任何没有attributes
作为输出的最终对象的属性。
这是我根据其他问题提出的方法:
function mapToObject(object, index) {
index.split('.').reduce(function (obj, i) {
return obj[i];
});
}
另一个基于现实世界的例子是我有一个字符串数组......
[{ key: 'author.id', value: '1'}, { key: 'image.id', value: '1'}]
然后我将遍历这些并将它们作为对象属性添加到预定义的对象中。
let mappedRelationships = {};
let relationships = [
{
key: 'author.id',
value: 1
},
{
key: 'primaryImage.id',
value: 12
}
];
relationships.forEach((relationship) => {
mappedRelationships = {
...mappedRelationships,
// This is where I would need to do the logic for the reduce
}
});
关系映射 var 的值如下:
{
author: {
attributes: {
id: 1
}
},
primaryImage: {
attributes: {
id: 12
}
}
}
解决方案
您可以通过拆分关系数组来reduce
创建具有键值对的对象。key
let relationships = [
{
key: 'author.id',
value: 1
},
{
key: 'primaryImage.id',
value: 12
}
];
let mappedRelationships = relationships.reduce((acc, {key, value}) => {
let [k, v] = key.split('.');
acc[k] = {attributes: {[v]: value}};
return acc
}, {});
console.log(mappedRelationships)
let relationships = [
{
key: 'author.sites.id',
value: 1
},
{
key: 'primaryImage.id',
value: 12
}
];
let mappedRelationships = relationships.reduce((acc, { key, value }) => {
let arr = key.split('.');
let extra = arr.length > 2 ? arr.shift() : null;
let [k1, k2] = arr;
let relationships = { [k1]: { attributes: { [k2]: value } } };
return extra ? {...acc, [extra]:{relationships}} : {...acc, relationships};
}, {});
console.log(JSON.stringify(mappedRelationships))
推荐阅读
- arrays - 我有一些在 <> 中的字符串数据,我想将其转换为列表
- r - 如何使用 ggplot 有条件地在美国地图上着色?
- visual-studio-2022 - 如何修复 VS2022 预览版的更新 4 升级“C++/WinRT”
- typescript - 打字稿:强制键和值属于同一类型?
- multithreading - 同一工人上的螺栓的 Apache Storm 问题
- python - Nuke Python 在 nuke 脚本文件中保存工具设置
- html - 如何使用 CSS 自定义复选框?
- reactjs - ApolloProvider 客户端 - 如何从 React Class 组件访问?
- python - 如何强制python使用cmd而不是powershell执行命令
- swift - Swift 程序中的 Firebase 存储参考问题