首页 > 解决方案 > 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
        }
    }
}

标签: javascriptarraysobject

解决方案


您可以通过拆分关系数组来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)
如果字符串有 3 个参数,您可以使用条件

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))


推荐阅读