ES6解构嵌套对象

3

你好吗?我想从嵌套对象中删除一个属性(“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;
}

尝试了下面的代码但没有成功 :( < p > const { answerOptions: [{ isCorrect }], ...rest } = question < /p > 谢谢

3
你为什么认为“删除”不是最佳方法? - hackape
是因为您不想改变原始副本,或者您仍然需要将其用于其他目的吗? - hackape
因为我将改变对象,而这不是计划中的事情。祝您有美好的一天! - Alexandre Bonfim
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
非常感谢,祝你一切顺利! - Alexandre Bonfim

0

这取决于您想要改变现有数组还是创建一个新数组。如果是前者,您的代码就没问题了(我在下面提供了更新版本)。如果是后者,Majed Badawi使用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);


感谢您的整理,但我不想改变主要对象的重点!干杯!!! - Alexandre Bonfim

0

这里有另一种(更长的)实现所需输出的方法。从外到内工作,首先我们映射数组test中的所有对象。我使用剩余运算符将answerOptions对象数组与其他问题属性分开。接下来,我们需要映射answerOptions数组。使用剩余运算符创建一个不包含isCorrect属性的新的answerOption对象。最后,我们将它们全部合并在一起。返回一个包含分离的问题属性和新的没有isCorrectanswerOptions对象的对象。

  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))


请在您的答案中添加一些解释,以便其他人可以从中学习。 - Nico Haase

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接