Как преобразовать список объектов во вложенные объекты после сравнения ключа - PullRequest
1 голос
/ 04 июня 2019

Цель: получить список объектов во вложенном объекте на основе его родительского значения.

Здесь у меня ниже моих json данных:

"data": [
    {
      "id": "coding-825x500",
      "source": {
        "information": {
          "fileid": "coding-825x500",
          "filesize": 67340
        },
        **"dependent": "d1bc270d"**
      }
    },
    {
      "id": "d1bc270d",
      "source": {
        "information": {
          "fileid": "d1bc270d",
          "filesize": 193
        },
        "dependent": "parent"
      }
    },
    {
      "id": "1_iwPLQ",
      "source": {
        "information": {
          "fileid": "1_iwPLQ",
          "filesize": 580969
        },
        "dependent": "d1bc270d"
      }
    },
    {
      "id": "coding-825",
      "source": {
        "information": {
          "fileid": "coding-825",
          "filesize": 67340
        },
        "dependent": null
      }
    }
  ]
}

Здесь в каждом объекте у нас есть идентификатор & зависимый

{ 
  "id": A
   "dependent":parent
},
{ 
  "id": B
   "dependent":A
},
{ 
  "id": C
   "dependent":A
},
{ 
  "id": D
   "dependent":null
}

Если идентификатор равен зависимому идентификатору, то он должен быть дочерним, а если зависимый является родительским, тоid == dependent должен соответствовать этому правилу, и если для него установлено значение null, то это также родитель без дочерних элементов.

Ниже я работал с фильтром, но позже я не уверен, как поступить и создать вложенные объекты.

let info = this.dynamic.data.filter((val)=>{
     console.log(val.id, ":::" ,val.source.dependent);
   })

Stackblitz => https://stackblitz.com/edit/angular-zvcea7

Желаемый вывод: все дочерние объекты должны быть под родительским для настройки вложенных данных, таблица может иметь формат, приведенный ниже.

  {

        "id": "A",
        "dependent":parent

        "nested":[

           {

                "id":"B",

                "dependent":"A"

            },
             {

                "id":"c",

                "dependent":"A"

            },



        ]

    },
     {

        "id": "c",
        "dependent":null


    }

Ответы [ 2 ]

1 голос
/ 04 июня 2019

Ну, вы можете использовать функцию уменьшения массива, чтобы добиться этого.

var data = [{"id": "coding-825x500","source": {"information": {"fileid": "coding-25x500","filesize": 67340},"dependent": "d1bc270d"}},{"id": "d1bc270d","source": {"information": {"fileid": "d1bc270d","filesize": 193},"dependent": "parent"}},{"id": "1_iwPLQ","source": {"information": {"fileid": "1_iwPLQ","filesize": 580969},"dependent": "d1bc270d"}},{"id": "coding-825","source": {"information": {"fileid": "coding-825","filesize": 67340},"dependent": null}}];
var result = data.reduce(function(acc, elem) {
    if( elem.source.dependent === 'parent') {
      var dependents = data.filter(function(a) { return a.source.dependent ===elem.id});
      if( dependents && dependents.length ) {
          elem.nested = elem.nested || [];
          (dependents || []).forEach(function(d) {
              elem.nested.push(d);
          })
         acc.push(elem);
      } else {
          acc.push(elem);
      }
  } else if( elem.source.dependent === null) {
      acc.push(elem);
  }
  return acc;
}, []);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

PS. Это не оптимизировано в полной мере.

1 голос
/ 04 июня 2019

Вы можете построить дерево и использовать для узлов с 'parent' равномерное значение null.

Этот подход работает и для несортированных данных.

var data = [{ id: 'A', dependent: 'parent' }, { id: 'B', dependent: 'A' }, { id: 'D', dependent: null }, { id: 'C', dependent: 'A' }],
    tree = function (data) {
        var t = {};
        data.forEach(o => {
            var parent = o.dependent === 'parent' ? null : o.dependent;
            Object.assign(t[o.id] = t[o.id] || {}, o);
            t[parent] = t[parent] || {};
            t[parent].nested = t[parent].nested || [];
            t[parent].nested.push(t[o.id]);
        });
        return t.null.nested;
    }(data);

console.log(tree);
.as-console-wrapper { max-height: 100% !important; top: 0; }

С первым набором данных.Свойство dependent вложено в другой объект.

var data = [{ id: "coding-825x500", source: { information: { fileid: "coding-825x500", filesize: 67340 }, dependent: "d1bc270d" } }, { id: "d1bc270d", source: { information: { fileid: "d1bc270d", filesize: 193 }, dependent: "parent" } }, { id: "1_iwPLQ", source: { information: { fileid: "1_iwPLQ", filesize: 580969 }, dependent: "d1bc270d" } }, { id: "coding-825", source: { information: { fileid: "coding-825", filesize: 67340 }, dependent: null } }],
    tree = function (data) {
        var t = {};
        data.forEach(o => {
            var parent = o.source.dependent === 'parent' ? null : o.source.dependent;
            Object.assign(t[o.id] = t[o.id] || {}, o);
            t[parent] = t[parent] || { id: parent, source: null };
            t[parent].nested = t[parent].nested || [];
            t[parent].nested.push(t[o.id]);
        });
        return t.null.nested;
    }(data);

console.log(tree);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...