Как преобразовать массив в JSON на основе ключей, таких как Java-пакеты, чтобы получить представление в виде дерева - PullRequest
0 голосов
/ 26 октября 2018

Мой вопрос о том, как конвертировать массив в JSON на основе ключей, таких как пакеты.

У меня есть этот массив как начальный

$scope.myValues = [
{
    title:"Transportation",
    id:"1",
    moduleId:"transportation"
},
{
    title:"Bus",
    id:"1.1",
    moduleId:"transportation.bus"
},
{
    title:"Tata Motors",
    id:"1.1.1",
    moduleId:"transportation.bus.tata.motors"
},
{
    title:"Ashok Leyland",
    id:"1.1.2",
    moduleId:"transportation.bus.ashok.leyland"
},
{
    title:"Eicher Motors",
    id:"1.1.3",
    moduleId:"transportation.bus.eicher.motors"
},
{
    title:"Train",
    id:"1.2",
    moduleId:"transportation.train"
},
{
    title:"The Himalayan Queen",
    id:"1.2.1",
    moduleId:"transportation.train.himQueen"
},
{
    title:"Maharaja Deccan Odyssey",
    id:"1.2.2",
    moduleId:"transportation.train.maharaja.deccan"
},
{
    title:"Darjeeling Himalayan Railway",
    id:"1.2.3",
    moduleId:"transportation.train.darjeeling.himalayan"
}
];

и я хочу, чтобы мой окончательный массив был отсортирован по ключам, как пакеты ключей в java.

$scope.myValues = [{
title:"Transportation",
moduleId:"transportation",
category:[{
    title:"Bus",
    moduleId:"transportation.bus",
    category:[{
        title:"Tata Motors",
        moduleId:"transportation.bus.tataMotors",
        },{
        title:"Ashok Leyland",
        moduleId:"transportation.bus.ashokLeyland",
        },{
        title:"Eicher Motors",
        moduleId:"transportation.bus.eicherMotors",
        }
    ]
},{
    title:"Train",
    moduleId:"transportation.train",
    category:[{
        title:"The Himalayan Queen",
        moduleId:"transportation.train.himQueen",
        },{
        title:"Maharaja Deccan Odyssey",
        moduleId:"transportation.train.maharajaDeccan",
        },{
        title:"Darjeeling Himalayan Railway",
        moduleId:"transportation.train.darjeelingHimalayan",
        }
    ]
}];

У меня есть ключи, такие как индексация. Моя цель - создать объект формата json со структурой иерархии, основанной на индексации. Никаких предложений нет, как преобразовать этот массив в массив, как в формате JSON.

1 Ответ

0 голосов
/ 26 октября 2018

Вы можете создать это дерево, зациклив данные один раз.

  • Начните с пустого массива для нашего нового формата
  • Проверьте первый элемент
    • Разделите его идентификатор на . и приведите элементы пути к индексам
    • Разделите числовой путь до последнего индекса и путь к нему
  • Создайте новыйэлемент, на данный момент без свойства category
  • Перемещайтесь по новому формату с помощью числового пути, создавая массивы category по мере необходимости
  • Когда вы достигли самого глубокого /последний слой, добавить в массив, используя последний индекс

const data = [{title:"Transportation",id:"1",moduleId:"transportation"},{title:"Bus",id:"1.1",moduleId:"transportation.bus"},{title:"Tata Motors",id:"1.1.1",moduleId:"transportation.bus.tata.motors"},{title:"Ashok Leyland",id:"1.1.2",moduleId:"transportation.bus.ashok.leyland"},{title:"Eicher Motors",id:"1.1.3",moduleId:"transportation.bus.eicher.motors"},{title:"Train",id:"1.2",moduleId:"transportation.train"},{title:"The Himalayan Queen",id:"1.2.1",moduleId:"transportation.train.himQueen"},{title:"Maharaja Deccan Odyssey",id:"1.2.2",moduleId:"transportation.train.maharaja.deccan"},{title:"Darjeeling Himalayan Railway",id:"1.2.3",moduleId:"transportation.train.darjeeling.himalayan"}];

const addModule = (arr, { title, moduleId, id }) => {
  const entry = { title, moduleId }; 
  const path = id.split(".").map(Number).map(n => n - 1);
  
  const targetIndex = path[path.length - 1];
  const indexes = path.slice(0, -1);
  
  const loc = indexes.reduce(
    (arr, i) => {
      const next = arr[i];
      if (!next.category) next.category = [];
      return next.category;
    },
    arr
  );
  
  loc[targetIndex] = entry;
  return arr;
}

console.log(
  data.reduce(addModule, [])
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...