Узел JS Как построить вложенный объект, используя родительские идентификаторы - PullRequest
0 голосов
/ 14 июня 2019

для моей стажировки мне нужно создать вложенный объект, используя родительские идентификаторы. Я не хочу массив атрибутов children.У меня есть массив объектов с идентификатором и родительским идентификатором, и я использую npm flatnest, чтобы сделать это.Это работает для одноуровневой иерархии, но код должен быть адаптирован для многоуровневого уровня.Я не знаю, как адаптировать это к уровню нескольких иерархий.

Это мой массив объектов

var fn = require("flatnest");

const flat =
[
    { "id": 1, "name": 'Restaurants', 'parentId': 0},
    { "id": 2, "name": 'family restaurant', 'parentId': 1, 'value':'Excellent'},
    { "id": 3, "name": 'Sun restaurant', 'parentId': 1,'value':""},
    { "id": 4, "name": 'Sun restaurant 1', 'parentId': 3, 'value':'Good'},
    { "id": 5, "name": 'Sun restaurant 2', 'parentId': 3, 'value':"bad"},
    { "id": 6, "name": 'Hotels', 'parentId': 0,'value':""},
    { "id": 7, "name": 'Space Hotel', 'parentId': 6,'value':""},
    { "id": 8, "name": 'Sun Hotel', 'parentId': 7,'value':'Nice'},
    { "id": 9, "name": 'Moon Hotel', 'parentId': 7,'value':""},
    { "id": 10, "name": 'Moon Hotel 1', 'parentId': 9, 'value':"Excellent"},
    { "id": 11, "name": 'Moon Hotel 2', 'parentId': 9, 'value':"Worst"},

];

Чтобы использовать вложенную функцию npm flatnest, я должен выровнять свой массивобъекта (const flat)

Мой код для flat:

var transform={};

for(var i=0;i<flat.length;i++)
{

  if(typeof flat[parseInt(i)+1] !== 'undefined' )
  {
    if(flat[i].id==flat[i+1].parentId)
    {
      var t = flat[i].name;
      transform[t.concat(".").concat(flat[i+1].name)]=flat[i+1].value;
  }else{
      transform[t.concat(".").concat(flat[i+1].name)]=flat[i+1].value;

    }

}
}

console.log(transform)
var nested = fn.nest(transform)
console.log(nested)

Я ожидаю, что выход console.log (transform) будет

{ 'Restaurants.family restaurant':'Excellent',
  'Restaurants.Sun restaurant.Sun restaurant 1': 'Good',
  'Restaurants.Sun restaurant.Sun restaurant 2': 'bad',
  'Hotels.Space Hotel.Sun Hotel': 'Nice',
  'Hotels.Space Hotel.Moon Hotel.Moon Hotel 1': 'Excellent',
  'Hotels.Space Hotel.Moon Hotel.Moon Hotel 2' : 'Worst'}

Тогдаиспользуя вложенную функцию:

 var nested = fn.nest(transform)
 console.log(nested)

Вывод должен быть в точности таким:

 "Restaurants":{
        "family restaurant":"Excellent",
        "Sun restaurant":{
          "Sun restaurant 1":"Good",
          "Sun restaurant 2":"bad"
        }
      },
      "Hotels":{
        "Space Hotel":{
          "Sun Hotel":"Nice",
          "Moon Hotel":{
            "Moon Hotel 1":"Excellent",
            "Moon Hotel 2":"Worst"
          }
        }
      }

}

, но фактический вывод console.log (transform):

{'Restaurants.family restaurant':'Excellent',
 'Restaurant.Sun restaurant':'',
 'Sun restaurant.Sun restaurant 1':'Good',
 'Sun restaurant.Sun restaurant 2':'bad',
 'Sun restaurant.Hotels':'',
 'Hotels.Space Hotel':'',
 'Space Hotel.Sun Hotel':'Nice'
 'Space Hotel.Moon Hotel':'',
 'Moon Hotel.Moon Hotel 1':'Excellent',
 'Moon Hotel.Moon Hotel 2': 'Worst'}

1 Ответ

0 голосов
/ 14 июня 2019

Я не использую flatnest. Но приведенный ниже код работает для меня. Пожалуйста, проверьте и дайте мне знать, если это не работает для любого сценария.

const flat = [{
    "id": 1,
    "name": 'Restaurants',
    'parentId': 0
  },
  {
    "id": 2,
    "name": 'family restaurant',
    'parentId': 1,
    'value': 'Excellent'
  },
  {
    "id": 3,
    "name": 'Sun restaurant',
    'parentId': 1,
    'value': ""
  },
  {
    "id": 4,
    "name": 'Sun restaurant 1',
    'parentId': 3,
    'value': 'Good'
  },
  {
    "id": 5,
    "name": 'Sun restaurant 2',
    'parentId': 3,
    'value': "bad"
  },
  {
    "id": 6,
    "name": 'Hotels',
    'parentId': 0,
    'value': ""
  },
  {
    "id": 7,
    "name": 'Space Hotel',
    'parentId': 6,
    'value': ""
  },
  {
    "id": 8,
    "name": 'Sun Hotel',
    'parentId': 7,
    'value': 'Nice'
  },
  {
    "id": 9,
    "name": 'Moon Hotel',
    'parentId': 7,
    'value': ""
  },
  {
    "id": 10,
    "name": 'Moon Hotel 1',
    'parentId': 9,
    'value': "Excellent"
  },
  {
    "id": 11,
    "name": 'Moon Hotel 2',
    'parentId': 9,
    'value': "Worst"
  },

];

const map = new Map();
const result = flat.reduce((acc, curr) => {
  let val = {}
  if (curr.parentId == 0)
    acc[curr.name] = val;
  else {
    if (map.get(curr.parentId)) {
      if (curr.value != '')
        val = curr.value;
      map.get(curr.parentId)[curr.name] = val;
    }
  }
  map.set(curr.id, val);
  return acc;
}, {});

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