Деструктурирование вложенного объекта es6

#javascript #json #typescript

Вопрос:

как дела? Я хотел бы удалить свойство(«isCorrect») из вложенного объекта.

Первоначальный список

     id: 1,
    questionText: 'This is a test question for tests',
    answerOptions: [
      {
        answerText: 'A',
        isCorrect: true
      },
      {
        answerText: 'B',
        isCorrect: false
      }
    ],
    difficulty: 1
  },
  {
    id: 2,
    questionText: 'This is another test question for tests',
    answerOptions: [
      {
        answerText: 'A',
        isCorrect: false
      },
      {
        answerText: 'B',
        isCorrect: true
      }
    ],
    difficulty: 2
  }
 

Ожидаемый результат

     id: 1,
    questionText: 'This is a test question for tests',
    answerOptions: [
      {
        answerText: 'A'
      },
      {
        answerText: 'B'
      }
    ],
    difficulty: 1
  },
  {
    id: 2,
    questionText: 'This is another test question for tests',
    answerOptions: [
      {
        answerText: 'A'
      },
      {
        answerText: 'B'
      }
    ],
    difficulty: 2
  }
 

Мне удалось использовать приведенный ниже код удаления, но это не лучший подход

 const cleanResponses = (questions: Question[]): Question[] => {
  questions.forEach(question => {
    question.answerOptions.forEach((answer) => {
      delete answer.isCorrect
    });
  })

  return questions;
}
 

Попробовал строку ниже, но безуспешно 🙁

const { Варианты ответов: [{ isCorrect }], …rest } = вопрос

Спасибо

Комментарии:

1. Как вы думаете, почему delete это не лучший подход?

2. Это потому, что вы не хотите изменять исходную копию, возможно, вам все еще нужно использовать ее для других целей?

3. Потому что я изменю объект, а это не входит в план. Добрый день!

Ответ №1:

С помощью Array#map :

 const arr = [
  { id: 1,
    questionText: 'This is a test question for tests',
    answerOptions: [ { answerText: 'A', isCorrect: true }, { answerText: 'B', isCorrect: false } ],
    difficulty: 1
  },
  {
    id: 2,
    questionText: 'This is another test question for tests',
    answerOptions: [ { answerText: 'A', isCorrect: false }, { answerText: 'B', isCorrect: true } ],
    difficulty: 2
  }
];

const res = arr.map(({ answerOptions = [], ...elem }) => ({
  ...elem, 
  answerOptions: answerOptions.map(({ isCorrect, ...answer }) => answer)
}));

console.log(res); 

Комментарии:

1. Большое спасибо, приятного аппетита!!!

Ответ №2:

Это зависит от того, хотите ли вы изменить существующий массив или создать новый массив. Если это первое, ваш код в порядке (я предоставил обновленную версию ниже). Если это последнее, Маджед Бадави дал хороший ответ, используя map . В любом случае вы будете перебирать как объекты в массиве данных, так и объекты в answerOptions массиве, чтобы получить нужный вам результат.

 const arr=[{id:1,questionText:"This is a test question for tests",answerOptions:[{answerText:"A",isCorrect:!0},{answerText:"B",isCorrect:!1}],difficulty:1},{id:2,questionText:"This is another test question for tests",answerOptions:[{answerText:"A",isCorrect:!1},{answerText:"B",isCorrect:!0}],difficulty:2}];

for (let { answerOptions } of arr) {
  for (let obj of answerOptions) {
    delete obj.isCorrect;
  }
}

console.log(arr); 

Комментарии:

1. спасибо за очистку, но дело в том, что я не хочу менять основной объект! Ура!!!!

Ответ №3:

Вот еще один (более длительный) способ достижения желаемого результата. Работая от выхода к входу, сначала мы сопоставляем все объекты в массиве test . Я использую оператор rest для отделения массива answerOptions объектов от других свойств вопроса. Затем нам нужно составить карту по всему answerOptions массиву. Используя оператор rest, создайте новый объект answerOption, который не содержит isCorrect свойства. Наконец, мы сводим все это воедино. Возвращает объект, содержащий разделенные свойства вопроса и новые answerOptions объекты без isCorrect них .

   const test = [
    {
      id: 1,
      questionText: "This is a test question for tests",
      answerOptions: [
        {
          answerText: "A",
          isCorrect: true
        },
        {
          answerText: "B",
          isCorrect: false
        }
      ],
      difficulty: 1
    },
    {
      id: 2,
      questionText: "This is another test question for tests",
      answerOptions: [
        {
          answerText: "A",
          isCorrect: false
        },
        {
          answerText: "B",
          isCorrect: true
        }
      ],
      difficulty: 2
    }
  ];

  const cleanResponses = (questions) => {
    return questions.map(({ answerOptions, ...rest }) => {
      const newAnswerOptions = answerOptions.map((answerOption) => {
        const { isCorrect, ...newAnswerOption } = answerOption;
        return newAnswerOption;
      });
      return { answerOptions: { ...newAnswerOptions }, ...rest };
    });
  };
  
  console.log(cleanResponses(test)) 

Комментарии:

1. Пожалуйста, добавьте некоторые пояснения к вашему ответу, чтобы другие могли извлечь из него уроки