Цикл по вложенному массиву объектов, сопоставление с другим массивом объектов - PullRequest
1 голос
/ 24 октября 2019

Я новичок в Javascript и пытаюсь перебрать один вложенный массив объектов и фильтрую второй массив объектов на основе свойств первого.

Вот структуры обоих массивов:

const displayArr = {
   sections: {
      section_1: [
        {
          style: "single_select_cmp",
          definition: {
            table_name: "table_1",
            field_name: "organization",
          }
        },
      ],
      section_2: [
        {
          style: "single_select_cmp",
          definition: {
            table_name: "table_1",
            field_name: "title",
          }
        },
      ]
   }
};

const schemaArr = [
  {
    table_1: {
      columns: [
        {
          description: "Tracking Number Desc",
          display_name: "Tracking Number",
          display_type: "number",
          field: "tracking_number",
          type: "int"
        },
        {
          description: "Title Desc",
          display_name: "Title",
          display_type: "multiple lines of text",
          field: "title",
          type: "text"
        },
        {
          description: "Description Desc",
          display_name: "Description",
          display_type: "multiple lines of text",
          field: "description",
          type: "text"
        },
        {
          description: "Organization Desc",
          display_name: "Organization",
          display_type: "single line of text",
          field: "organization",
          type: "text"
        }
     ]
   }
 },
 {
  table_2: { columns: [ {...}, {...} ] }
 },
 {
  table_3: { columns: [ {...}, {...} ] }
 }
 ...
]

Я пытаюсь отфильтровать schemaArr по table_name и field_name в displayArr. Когда есть совпадение, я бы хотел предоставить description и display_name для displayArr. Например:

const displayArr = {
   sections: {
      section_1: [
        {
          style: "single_select_cmp",
          definition: {
            table_name: "table_1",
            field_name: "organization",
            description: "Organization Description", //***
            display_name: "Organization" //***
          }
        },
      ],
      section_2: [
        {
          style: "single_select_cmp",
          definition: {
            table_name: "table_1",
            field_name: "title",
            description: "Title Description", //***
            display_name: "Title" //***
          }
        },
      ]
   }
};

В этом примере я извлекаю только из table_1, однако может быть любое количество таблиц, на которые есть ссылки в displayArr.

Для меня, учитывая, что эти объекты вложены, это более сложная ситуация отображения / фильтрации. Мне интересно, как правильно и эффективно использовать карту, фильтр и / или forEach.

Заранее благодарю за помощь! Очень ценю это.

1 Ответ

1 голос
/ 24 октября 2019

Object.values ​​() может использоваться для получения значений displayArr объекта, а forEach () может использоваться для его итерации.

метод find () может использоваться для поиска таблицы с table_name в schemaArr. Если таблица существует, то метод find () может быть снова использован для поиска столбца с элементом field_name.

Тогда элемент определения объекта displayArr можно обновить с помощью значений этого найденного столбца. .

Object.values(displayArr.sections).forEach(section => {
  section.forEach(item => {
    let table = schemaArr.find(table => table[item.definition.table_name]);

    if (table) {
      // Find column by field_name.
      let obj = table[item.definition.table_name].columns.find(column => column.field === item.definition.field_name);           

      if (obj) {
        // Update definition.
        item.definition.description = obj.description;
        item.definition.display_name = obj.display_name;
      }
    }
  });
});
...