如何在TypeScript中从拆分字符串数组创建/合并对象?

时间:2018-09-30 15:06:10

标签: javascript arrays typescript reduce

我有一个像下面这样的对象数组;

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}

这很接近我想做的事,但我应该合并并提供一个钥匙。如何在还原方法中将第一个值作为关键?可以合并具有相同密钥的对象吗?

2 个答案:

答案 0 :(得分:1)

在属性列表上使用Array.reduce()。用:分割路径后,检查是否有second部分。如果有第二部分,则分配一个对象。在先前的值上使用object spread,因为undefinedtrue的值将被忽略,而对象属性将被添加。如果没有第二部分,则将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);