@depressionofoleg

Как массив превратить в связный список?

Имеется массив:

[
      {
        "h1": "h001",
        "h2": "z001"
      },
      {
        "h1": "h002",
        "h2": "z002"
      },
      {
        "h1": "h003",
        "h2": "z003"
      }
    ]

Надо его преобразовать так, чтобы нулевой элемент был родителем остальных, первый был родителем второго и т.д.:

[{
        "h1": "h001",
        "h2": "z001",
        "children": {
            "h1": "h002",
            "h2": "z002",
            "children": {
                "h1": "h003",
                "h2": "z003"
              }
         } 
}]
  • Вопрос задан
  • 143 просмотра
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
Перебираем массив от конца к началу, на каждом шаге создаём копию текущего элемента, к которой будет добавлена ссылка на объект, полученный на предыдущем шаге.

Коротко:

const arrToSinglyLinkedList = (arr, nextKey = 'next') =>
  arr.reduceRight((acc, n) => ({ ...n, [nextKey]: acc }), null);

Длинно:

function arrToSinglyLinkedList(arr, nextKey = 'next') {
  let list = null;

  for (let i = arr.length; i--;) {
    const node = Object.assign({}, arr[i]);
    node[nextKey] = list;
    list = node;
  }

  return list;
}

Пользоваться этим, понятное дело, так:

const list = arrToSinglyLinkedList(arr, 'child');
Ответ написан
@DromHour
const example = (arr) => {
    let result = [];
    if (Array.prototype.hasOwnProperty.call(arr, 0) && arr[0] instanceof Object)
        result.push(arr[0]);
    let lastObj = result[0];
    for (let i = 1; i < arr.length; ++i) {
        const el = arr[i];
        if (el && el instanceof Object) {
            lastObj.children = el;
            lastObj = el;
        }
    }
    return result;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы