【问题标题】:Convert id-keyed objects into array [closed]将 id-keyed 对象转换为数组 [关闭]
【发布时间】:2021-07-09 14:28:32
【问题描述】:

我有以下带有嵌套对象的对象,这些对象由它们自己的 ID 标识为其键。我觉得这不是使用 Angular 的正确方法,因此我需要摆脱 ID 键,因为每个对象已经有自己的 id 作为其属性。

{
  "1": {
    "id": 1,
    "questionGroup": "Mathematics",
    "questions": {
      "1": {
        "id": 1,
        "questionTitle": "2+2",
        "questionType": "singleChoice",
        "answerOptions": {
          "1": {
            "id": 1,
            "answerOptionText": "4"
          },
          "2": {
            "id": 2,
            "answerOptionText": "3"
          }
        }
      }
    }
  },
  "2": {
    "id": 2,
    "questionGroup": "Geography",
    "questions": {
      "3": {
        "id": 3
      }
    }
  },
  "3": {
    "id": 3,
    "questionGroup": "Philosophy",
    "questions": {
      "4": {
        "id": 4
      }
    }
  }
}

但是我需要把它转换成下面的:

[
  {
    "id": 1,
    "questionGroup": "Mathematics",
    "questions": [
      {
        "id": 1,
        "questionTitle": "2+2",
        "questionType": "singleChoice",
        "answerOptions": [
          {
            "id": 1,
            "answerOptionText": "4"
          },
          {
            "id": 2,
            "answerOptionText": "3"
          }
        ]
      }
    ]
  },
  {
    "id": 2,
    "questionGroup": "Geography",
    "questions": [
      {
        "id": 3
      }
    ]
  },
  {
    "id": 3,
    "questionGroup": "Philosophy",
    "questions": [
      {
        "id": 4
      }
    ]
  }
]

我希望看到使用最现代的 JavaScript 方法来处理这个问题的答案,因为我觉得使用带有许多嵌套迭代器和条件的老式方法不太好。

json_result = [];
db.query(`SELECT ex.id, ex.name, qgrp.id as questionGroupId, qgrp.name as questionGroupName, ans.id as answerOptionId, ans.\`text\` as questionName, ans.question_type as questionType, ansopt.id as answerOptionId, ansopt.display_text as answerOptionText FROM _questionGroup qgrp
    INNER JOIN exam ex 
    ON ex.id = qgrp.examId 
    INNER JOIN question ans 
    ON ans.questionGroupId = qgrp.id 
    INNER JOIN answerOption ansopt 
    ON ansopt.answerOptionId  = ans.id
    AND ex.id = ?;`, [req.params.id], (err, rows, results) => {
        if(!err) {
            var index = {}, questionGroup = {}, question = {};

            rows.forEach(function (row) {
                console.log("ROW: ", row);
                if ( !(row.id in index) ) {
                    index[row.id] = {
                        id: row.id,
                        name: row.name,
                        questionGroup: {}
                    };
                    json_result.push(index[row.id]);
                }
                if( !(row.questionGroupId in questionGroup) ) {
                    questionGroup[row.questionGroupId] = {
                        id: row.questionGroupId,
                        name: row.questionGroupName,
                        question: {}
                    };
                    index[row.id].questionGroup[row.questionGroupId] = questionGroup[row.questionGroupId];
                }
                if( !(row.answerOptionId in question) ) {
                    question[row.answerOptionId] = {
                        id: row.answerOptionId,
                        name: row.questionName,
                        question_type: row.questionType,
                        answerOptions: []
                    }
                }
                question[row.answerOptionId].answerOptions.push({
                    id: row.answerOptionId,
                    name: row.answerOptionText,
                });

                index[row.id].questionGroup[row.questionGroupId].question[row.answerOptionId] = question[row.answerOptionId];
            });


            res.status(200).json(json_result);
        } else {
            res.status(410).json(err);
        }
    }
);

【问题讨论】:

  • Object.values(data)
  • 这不是代码编写服务。包括您尝试过的内容。
  • 对不起!我将添加更多上下文
  • 谢谢@Keith。这惊人地解决了这个问题。我将作为问题答案发布给其他人。

标签: javascript ecmascript-5


【解决方案1】:

@Keith 的评论帮助找到了解决方案,即将在响应数据中添加Object.values(json_result) (Reference)。如下:

json_result = [];
db.query(`SELECT ex.id, ex.name, qgrp.id as questionGroupId, qgrp.name as questionGroupName, ans.id as answerOptionId, ans.\`text\` as questionName, ans.question_type as questionType, ansopt.id as answerOptionId, ansopt.display_text as answerOptionText FROM _questionGroup qgrp
    INNER JOIN exam ex 
    ON ex.id = qgrp.examId 
    INNER JOIN question ans 
    ON ans.questionGroupId = qgrp.id 
    INNER JOIN answerOption ansopt 
    ON ansopt.answerOptionId  = ans.id
    AND ex.id = ?;`, [req.params.id], (err, rows, results) => {
        if(!err) {
            var index = {}, questionGroup = {}, question = {};

            rows.forEach(function (row) {
                console.log("ROW: ", row);
                if ( !(row.id in index) ) {
                    index[row.id] = {
                        id: row.id,
                        name: row.name,
                        questionGroup: {}
                    };
                    json_result.push(index[row.id]);
                }
                if( !(row.questionGroupId in questionGroup) ) {
                    questionGroup[row.questionGroupId] = {
                        id: row.questionGroupId,
                        name: row.questionGroupName,
                        question: {}
                    };
                    index[row.id].questionGroup[row.questionGroupId] = questionGroup[row.questionGroupId];
                }
                if( !(row.answerOptionId in question) ) {
                    question[row.answerOptionId] = {
                        id: row.answerOptionId,
                        name: row.questionName,
                        question_type: row.questionType,
                        answerOptions: []
                    }
                }
                question[row.answerOptionId].answerOptions.push({
                    id: row.answerOptionId,
                    name: row.answerOptionText,
                });

                index[row.id].questionGroup[row.questionGroupId].question[row.answerOptionId] = question[row.answerOptionId];
            });


            res.status(200).json(Object.values(json_result));
        } else {
            res.status(410).json(err);
        }
    }
);

【讨论】:

    猜你喜欢
    • 2011-09-04
    • 1970-01-01
    • 2020-10-05
    • 2020-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多