Как создать родительское и дочернее json-дерево в js

#javascript

#javascript

Вопрос:

У меня есть json, подобный этому:

 data=[ { target: 'a', source: 'a' }
     , { target: 'a', source: 'b' }
     , { target: 'b', source: 'c' }
     , { target: 'c', source: 'd' }
     ];
  

но я хочу:

 data= { "target": "a", "children": [
        { "target": "b", "children": [
          { "target": "c", "children": [
           { "target": "d" } ] } ] };
  

как вы пишете это в js

Комментарии:

1. Вы уже «написали это на JS», так в чем же ваш актуальный вопрос?

2. JSON расшифровывается как «Объектная нотация Java Script»

3. вы должны сделать обратную связь

4. Извините за поздний ответ, мой интернет не работал в течение 2 дней. Я думаю, что я недостаточно ясно объясняю, я хочу написать Java-скрипт для форматирования данных в виде дерева

Ответ №1:

Не уверен, что это наилучший возможный код, но он работает

 const
  data = [ { target: 'a', source: 'a' }
          , { target: 'a', source: 'b' }
          , { target: 'b', source: 'c' }
          , { target: 'c', source: 'd' }
          ];

let
  CurKey       = '',
  CurrentChild = null,
  result       = null;
    
data.forEach( elm => {

  if (elm.target === elm.source) 
  {
    CurKey = elm.target; 
    result = { "target": CurKey, "children": [] };
    CurrentChild = result.children;
  }
  else if (elm.target === CurKey)
  {
    CurKey = elm.source;

    if (data.findIndex(ef=>ef.target===elm.source) >0 )
    {
      let newElm = { "target": CurKey, "children": [] };
      CurrentChild.push(newElm)
      CurrentChild = newElm.children;
    }
    else
    {
      let newElm = { "target": CurKey };
      CurrentChild.push(newElm)
      CurrentChild = null;
      CurKey = null;
    }
  }

});

console.log(JSON.stringify(result));  

Второй случай, без { target: ‘a’, source: ‘a’ } :

 const
  data =  [ { target: 'a', source: 'b' }
          , { target: 'b', source: 'c' }
          , { target: 'c', source: 'd' }
          ];

let
  CurKey       = '',
  CurrentChild = null,
  result       = null;
    
data.forEach( elm => {

  if (CurKey === '') 
  {
    CurKey = elm.target; 
    result = { "target": CurKey, "children": [] };
    CurrentChild = result.children;
  }
  if (elm.target === CurKey)
  {
    CurKey = elm.source;

    if (data.findIndex(ef=>ef.target===elm.source) >0 )
    {
      let newElm = { "target": CurKey, "children": [] };
      CurrentChild.push(newElm)
      CurrentChild = newElm.children;
    }
    else
    {
      let newElm = { "target": CurKey };
      CurrentChild.push(newElm)
      CurrentChild = null;
      CurKey = null;
    }
  }

});

console.log(JSON.stringify(result));  

Комментарии:

1. Похоже, это то, что мне нужно, я собираюсь попробовать. Спасибо

2. Еще один вопрос, что произойдет, когда target: ‘a’, source: ‘a’ отсутствует. будет ли это работать? Потому что я просто понимаю, что в моем наборе данных нет такого случая

3. Я нашел решение для этого второго случая, проверьте его в моем ответе 🙂

Ответ №2:

 var arr_1 = [];
var arr_2 = [];
var arr_3 = [];
var json = {};
var json_2 = {};
var json_3 = {};
var json_4 = {};

arr_3.push(json_4);
json_3.target = 'c';
json_3.children = arr_3;

arr_2.push(json_3);
json_2.target = 'b';
json_2.children = arr_2;

arr_1.push(json_2);
json.target = 'a';
json.children = arr_1;

console.log(json);  

Динамическое добавление в JSON json_2['target'] = 'c';

Комментарии:

1. есть ли способ сделать его динамическим, вместо того, чтобы жестко кодировать его в

2. @Lin Tong Да, если я вас правильно понимаю. Вам нужен пример или вы уже получили ответ?