Наиболее эффективный способ добавления уникальных идентификаторов в глубоко вложенный массив объектов - PullRequest
1 голос
/ 13 января 2020

Мне нужно добавить идентификаторы в массив объектов: Пример:

const workouts = [
  { 
    type: "walk"
    areas: [
      {
        location: 'park'
        day: 'Sunday'
      },
      {
        location: 'beach'
        day: 'Monday'
      }
    ],
    exercise: true
  },
  { 
    type: "run"
    areas: [
      {
        location: 'gym'
        day: 'Saturday'
      },
      {
        location: 'track'
        day: 'Sunday'
      }
    ],
    exercise: true
  }
]

В этом примере мне нужно добавить идентификаторы в массив workouts и глубоко вложенный массив areas. Я пришел к этому решению, отображающему все массивы:

const idMappings = workouts.map((workout) => {
    const workoutIdMapping = workout.id ? workout : { ...workout, id: uuid.v4() }; // if there is already an id just return the object -- otherwise generate a random id
    const areasIdMapping = workoutIdMapping.areas.map((area) => {
        return area.id ? area : { ...area, id: uuid.v4() }; // if there is already an id just return the object -- otherwise generate a random id
    });
    return { ...workoutIdMapping, areas: areasIdMapping }; // finally return the updated values with ids
});

Это правильно возвращает мне следующую область с идентификаторами:

const workouts = [
  { 
    id: "0000-0000-4e6b-9f24-f8e1f2402a9b"
    type: "walk"
    areas: [
      {
        id: "0000-1111-4e6b-9f24-f8e1f2402a9b"
        location: 'park'
        day: 'Sunday'
      },
      {
        id: "0000-2222-4e6b-9f24-f8e1f2402a9b"
        location: 'beach'
        day: 'Monday'
      }
    ],
    exercise: true
  },
  { 
    id: "1111-0000-4e6b-9f24-f8e1f2402a9b"
    type: "run"
    areas: [
      {
        id: "1111-1111-4e6b-9f24-f8e1f2402a9b"
        location: 'gym'
        day: 'Saturday'
      },
      {
        id: "1111-2222-4e6b-9f24-f8e1f2402a9b"
        location: 'track'
        day: 'Sunday'
      }
    ],
    exercise: true
  }
]

Этот алгоритм работал правильно, но есть ли более эффективный способ решения этой проблемы - Является ли многократное сопоставление не эффективным способом решения этой проблемы - возможно, есть более эффективные функции ES6, которые я могу использовать?

1 Ответ

0 голосов
/ 16 января 2020

Может быть, вы могли бы использовать рекурсию здесь. Как это:

function setIds (arr) {
  arr.forEach(item => {
    item.id = uuid.v4()
    if (item.areas && item.areas.length > 0) {
      setIds(item.areas)
    }
  })
}

setIds(workouts)
...