Каков наилучший способ удалить определенные объекты из вложенного объекта? - PullRequest
1 голос
/ 27 апреля 2020

У меня есть следующий вложенный объект:


{
  "cards": {
    "1": {
      "x": 247,
      "y": 213,
      "properties": {
        "id": 1,
        "name": "a",
        "intros": {
          "intro_0": {
            "id": 1,
            "cardId": 1
          },
          "intro_1": {
            "id": 2,
            "cardId": 1
          },
          "intro_3": {
            "id": 24,
            "cardId": 1
          }
        },
        "exits": {
          "exit_0": {
            "id": 1,
            "cardId": 1
          },
          "exit_1": {
            "id": 22,
            "cardId": 1            
          }
        },
        "mixins": {
          "mixin_0": {
            "id": 23,
            "cardId": 1
          }
        }
      }
    },
    "3": {
      "x": 762,
      "y": 187,
      "properties": {
        "id": 1,
        "name": "x",
        "intros": {
          "intro_0": {
            "id": 1,
            "cardId": 1
          },
          "intro_1": {
            "id": 263,
            "cardId": 1
          }
        },
        "exits": {
          "exit_0": {
            "id": 1,
            "cardId": 1
          },
          "exit_1": {
            "id": 2,
            "cardId": 1
          }
        },
        "mixins": {
          "mixin_0": {
            "id": 3,
            "cardId": 1
          }
        },
      }
    },
    "4": {
      "x": 1200,
      "y": 187,
      "properties": {
        "id": 1,
        "name": "j",
        "intros": {
          "intro_0": {
            "id": 1,
            "cardId": 1
          },
          "intro_1": {
            "id": 276,
            "cardId": 1
          }
        },
        "exits": {
          "exit_0": {
            "id": 1,
            "cardId": 1
          },
          "exit_1": {
            "id": 2,
            "cardId": 1
          }
        },
        "mixins": {
          "mixin_0": {
            "id": 3,
            "cardId": 1
          }
        }
      }
    }
  }
}

Я пытаюсь go через объект извлечь только первое из «intro» и первого из «exit» и изменить исходный объект, так что он содержит их только с остальными данными. Или, что то же самое, я хотел бы удалить все «вступления», кроме первого и все «выходы», кроме первого. Чтобы извлечь нужные значения, я сделал 3 для in ... но когда дело доходит до изменения исходного объекта, я думаю, что я сделал его слишком сложным, и должен быть какой-то более простой способ.

const cards: any = Object.values(data.cards);

      for (const indexCard in cards) {
        if (cards.hasOwnProperty(indexCard)) {
          const card = cards[indexCard];
          const cardIntros = card.properties.intros;
          for (const introIndex in cardIntros) {
            if (cardIntros.hasOwnProperty(introIndex) && introIndex === 'intro_0') {
              const firstIntro = cardIntros[introIndex];
              const cardsExits = card.properties.exits;
              for (const exitIndex in cardsExits) {
                if (cardsExits.hasOwnProperty(exitIndex) && exitIndex === 'exit_0') {
                  const firstExit = cardsExits[exitIndex];
                }
              }

            }
          }
        }
      }

Кто-нибудь видит более простой способ удаления «вступлений» и «выходов», которые я хочу удалить, чтобы создать новый объект, который содержит только нужные «вступления» и «выходы»?

Спасибо заранее!

1 Ответ

2 голосов
/ 27 апреля 2020

Вы можете создать рекурсивную функцию, которая будет проверять, является ли текущее значение объектом, а также также, если некоторые из ключей этого объекта равны ключам, предоставленным параметром. Если он включает этот ключ, он удалит другие ключи из этого объекта. Это будет работать для любого уровня вложенности.

const data = {"cards":{"1":{"x":247,"y":213,"properties":{"id":1,"name":"a","intros":{"intro_0":{"id":1,"cardId":1},"intro_1":{"id":2,"cardId":1},"intro_3":{"id":24,"cardId":1}},"exits":{"exit_0":{"id":1,"cardId":1},"exit_1":{"id":22,"cardId":1}},"mixins":{"mixin_0":{"id":23,"cardId":1}}}},"3":{"x":762,"y":187,"properties":{"id":1,"name":"x","intros":{"intro_0":{"id":1,"cardId":1},"intro_1":{"id":263,"cardId":1}},"exits":{"exit_0":{"id":1,"cardId":1},"exit_1":{"id":2,"cardId":1}},"mixins":{"mixin_0":{"id":3,"cardId":1}}}},"4":{"x":1200,"y":187,"properties":{"id":1,"name":"j","intros":{"intro_0":{"id":1,"cardId":1},"intro_1":{"id":276,"cardId":1}},"exits":{"exit_0":{"id":1,"cardId":1},"exit_1":{"id":2,"cardId":1}},"mixins":{"mixin_0":{"id":3,"cardId":1}}}}}}

function first(data, props = []) {
  return Object.entries(data).reduce((r, [k, v]) => {
    if (typeof v == 'object' && v != null) {
      if (Array.isArray(v)) {
        r[k] = v.map(e => first(e, props))
      } else {
        const value = { ...v }
        const check = props.some(p => Object.keys(v).includes(p))

        if (check) {
          for (let i in value) {
            if (!props.includes(i)) {
              delete value[i]
            }
          }
        }

        r[k] = first(value, props)
      }

    } else r[k] = v
    return r;
  }, {})
}


const result = first(data, ['intro_0', 'exit_0'])
console.log(result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...