Перебора вложенный массив объектов


У меня есть следующие JSON в список объектов, и я смогла найти требуемый объект, и передать его обратно, учитывая id. Все нормально работает, я просто интересно, если есть лучший (более эффективный) способ вернуть узел. Я открыт для использования 3-й партии инструмент, как lodash.

Полезные данные JSON:

{
  "_expanded": true,
  "_canDrop": false,
  "_id": "-1",
  "_name": "root",
  "_children": [
    {
      "_expanded": true,
      "_canDrop": false,
      "_id": "1",
      "_name": "Child 1",
      "_children": [
        {
          "_expanded": true,
          "_canDrop": false,
          "_id": "1-1",
          "_name": "Child 1-1",
          "_children": [
            {
              "_expanded": false,
              "_canDrop": false,
              "_id": "1-1-1",
              "_name": "Child 1-1-1",
              "_children": []
            }
          ]
        },
        {
          "_expanded": false,
          "_canDrop": false,
          "_id": "1-2",
          "_name": "Child 1-2",
          "_children": []
        },
        {
          "_expanded": false,
          "_canDrop": false,
          "_id": "1-3",
          "_name": "Child 1-3",
          "_children": []
        }
      ]
    },
    {
      "_expanded": true,
      "_canDrop": false,
      "_id": "2",
      "_name": "Child 2",
      "_children": [
        {
          "_expanded": false,
          "_canDrop": false,
          "_id": "2-2",
          "_name": "Child 2-2",
          "_children": []
        }
      ]
    }
  ]
}

Метод find:

public findNode = (id: any): TreeNode => {
    let result = null;
    if (this._id === id) {
      result = this;
    } else {
      if (this._children.length > 0) {
        for (let index = 0; index <= this._children.length - 1; index++) {
          result = this._children[index].findNode(id);
          if (result) {
            break;
          }
        }
      }
    }
    return result;
  }


803
6
задан 18 марта 2018 в 02:03 Источник Поделиться
Комментарии
1 ответ

Ваш метод уже хорошо выглядит! Я бы только сделать пару небольших изменений в логику следующим образом:


  1. В if (this._children.length > 0) не нужно как для петли
    сделаем проверку для вас

  2. Вместо того, чтобы использовать стандартный цикл for, я бы предпочел for..of
    петли. Машинопись будет transpile это так, он будет работать в любом
    среды

  3. Я предпочитаю ранние возвращения вложенных заявлений. Из-за этого, я
    рекомендую хранить result переменная в качестве небольшой блок
    возможно

С этими изменениями:

public findNode = (id: any): TreeNode => {
if (this._id === id) {
return this;
}

for (const child of this._children) {
const result = child.findNode(id);
if (result) {
return result;
}
}

return null;
}

Кроме того, здесь есть пара машинопись Примечания:


  1. Избежать any как чума. При использовании any вы говорите
    машинопись эффективно игнорировать любые ошибки в коде. Учитывая
    ваша структура данных, похоже id должно быть типа string

  2. Я настоятельно рекомендую включить
    strictNullChecks.
    Это поможет избежать большого класса ошибок

  3. Методы Public по умолчанию в TypeScript, имея это в виду я
    рекомендовать удаление public модификатор в большинстве случаев, так как он является избыточным. Однако, это не применяется, если вы работаете в команде с разработчиками, которые обычно работают с другими языками, поскольку это может привести к путанице в команде. Например, в C# по умолчанию
    что все методы private

С этими изменениями:

findNode = (id: string): TreeNode | null => {
if (this._id === id) {
return this;
}

for (const child of this._children) {
const result = child.findNode(id);
if (result) {
return result;
}
}

return null;
}

4
ответ дан 18 марта 2018 в 06:03 Источник Поделиться