Как создать / объединить объект из массива разделенных строк в TypeScript? - PullRequest
0 голосов
/ 30 сентября 2018

У меня есть массив объектов, как показано ниже;

const arr1 = [
  {"name": "System.Level" },
  {"name": "System.Status" },
  {"name": "System.Status:*" },
  {"name": "System.Status:Rejected" },
  {"name": "System.Status:Updated" }
]

Я пытаюсь разделить свойство name и создать объект.В конце я хотел бы создать объект, подобный;

{
  "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}

Это близко к тому, что я хочу сделать, но я должен слить и дать ключ.Как я могу дать первое значение в качестве ключа в методе Reduce?Можно ли объединять объекты с одинаковым ключом?

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018

Используйте Array.reduce() в списке свойств.После разделения пути на :, проверьте, есть ли second часть.Если есть вторая часть, назначьте объект.Используйте объект распространения на предыдущих значениях, потому что значения 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));
0 голосов
/ 30 сентября 2018

Вы можете уменьшить разделенные ключи и проверить, достигнут ли последний уровень, а затем присвоить 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);
...