我有一个像下面这样的对象数组;
const arr1 = [
{"name": "System.Level" },
{"name": "System.Status" },
{"name": "System.Status:*" },
{"name": "System.Status:Rejected" },
{"name": "System.Status:Updated" }
]
我正在尝试拆分名称属性并创建一个对象。最后,我想创建一个对象;
{
"System.Level": true,
"System.Status": {
"*": true,
"Rejected": true,
"Updated": true
}
}
我到目前为止所做的;
transform(element){
const transformed = element.split(/:/).reduce((previousValue, currentValue) => {
previousValue[currentValue] = true;
}, {});
console.log(transofrmed);
}
const transofrmed = arr1.foreEach(element => this.transform(element));
输出为;
{System.Level: true}
{System.Status: true}
{System.Status: true, *: true}
{System.Status: true, Rejected: true}
{System.Status: true, Updated: true}
这很接近我想做的事,但我应该合并并提供一个钥匙。如何在还原方法中将第一个值作为关键?可以合并具有相同密钥的对象吗?
答案 0 :(得分:1)
在属性列表上使用Array.reduce()
。用:
分割路径后,检查是否有second
部分。如果有第二部分,则分配一个对象。在先前的值上使用object spread,因为undefined
或true
的值将被忽略,而对象属性将被添加。如果没有第二部分,则将true
分配为值:
const array = [{ name: "System.Level" }, { name: "System.Status" }, { name: "System.Status:*" }, { name: "System.Status:Rejected" }, { name: "System.Status:Updated" }];
const createObject = (arr) =>
arr.reduce((r, { name }) => {
const [first, second] = name.split(':');
r[first] = second ? { ...r[first], [second]: true } : true;
return r;
}, {});
console.log(createObject(array));
答案 1 :(得分:0)
您可以减少拆分键并检查是否达到最后一个级别,然后分配true
,否则采用现有对象或新对象。
const
array = [{ name: "System.Level" }, { name: "System.Status" }, { name: "System.Status:*" }, { name: "System.Status:Rejected" }, { name: "System.Status:Updated" }],
object = array.reduce((r, { name }) => {
var path = name.split(':');
last = path.pop();
path.reduce((o, k) => o[k] = typeof o[k] === 'object' ? o[k] : {}, r)[last] = true;
return r;
}, {});
console.log(object);