将多个值映射到一个属性的最佳方法

时间:2019-10-15 08:05:51

标签: javascript lodash

我有以下对象,它们代表一个由一系列问题及其可能的答案选项组成的调查:

{ "surveyTitle": "Survey 1", "questionText": "Question 1?", "questionId": 1, "offeredAnswerText": "Answer 1", "offeredAnswerId": 1 },
{ "surveyTitle": "Survey 1", "questionText": "Question 1?", "questionId": 1, "offeredAnswerText": "Answer 2", "offeredAnswerId": 2 },
{ "surveyTitle": "Survey 1", "questionText": "Question 2?", "questionId": 2, "offeredAnswerText": "Answer 3", "offeredAnswerId": 3 }

这是从我桌上的INNER JOIN传来的,传递给前端的状态不是很好。我正在尝试修改调查对象,以便可以先按问题分组,然后将答案选项映射到他们的问题,以便它们看起来像这样:

question: { id: int, text: string, answerOptions: [] }

其中answerOptiontextid组成:

answerOption: { offeredAnswerId, offeredAnswerText }

我有以下表达式:

const questions = _.chain(rows).groupBy("id").map((question, i) => ({
        id: i,
        text: question[0].questionText,
        answerOptions: _.map(question, 'offeredAnswerText')
    })).value();

到目前为止,这还算不错,但是我希望answerOptions数组还包含完整的answerOption对象,即上面的id和文本。

我正在我的项目中使用lodash来解决这个问题。

1 个答案:

答案 0 :(得分:0)

您可以直接映射所需的属性。并以questionId代替id进行分组。

var rows = [{ "surveyTitle": "Survey 1", "questionText": "Question 1?", "questionId": 1, "offeredAnswerText": "Answer 1", "offeredAnswerId": 1 }, { "surveyTitle": "Survey 1", "questionText": "Question 1?", "questionId": 1, "offeredAnswerText": "Answer 2", "offeredAnswerId": 2 }, { "surveyTitle": "Survey 1", "questionText": "Question 2?", "questionId": 2, "offeredAnswerText": "Answer 3", "offeredAnswerId": 3 }],
    questions = _.chain(rows)
        .groupBy("questionId")
        .map((question, id) => ({
            id,
            text: question[0].questionText,
            answerOptions: _.map(question, ({ offeredAnswerId, offeredAnswerText }) => ({ offeredAnswerId, offeredAnswerText }))
        }))
        .value();

console.log(questions);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

相关问题