首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将两个对象数组的相同属性合并为一个

将两个对象数组的相同属性合并为一个
EN

Stack Overflow用户
提问于 2020-09-06 00:41:40
回答 1查看 30关注 0票数 0

我有一个来自后端的对象数组。

代码语言:javascript
复制
[
   [
        {
            "question_id": "565",
            "option_type": "1",
            "question_image": "",
            "option_number": "4",
            "correct_answer": "d",
            "marks": "4",
            "language": "Hindi",
            "skill_id": "",
            "nos_id": "29",
            "question": "वितरण लाइन के लिए प्रयुक्त प्रतीक को पहचानें",
            "options": [
                {
                    "image": "",
                    "option": "मौजूदा लाइन",
                    "checked": false
                },
                {
                    "image": "",
                    "option": "योजनाबद्ध लाइन",
                    "checked": false
                },
                {
                    "image": "",
                    "option": "भूमिगत लाइन",
                    "checked": false
                },
                {
                    "image": "",
                    "option": "ओवरहेड लाइन",
                    "checked": false
                }
            ]
        },
        {
            "question_id": "565",
            "option_type": "1",
            "question_image": "",
            "option_number": "4",
            "correct_answer": "d",
            "marks": "4",
            "language": "English",
            "skill_id": "",
            "nos_id": "29",
            "question": "Identify the symbol used for distribution line",
            "options": [
                {
                    "image": "",
                    "option": "E O 1",
                    "checked": false
                },
                {
                    "image": "",
                    "option": "E O 2",
                    "checked": false
                },
                {
                    "image": "",
                    "option": "E O 3",
                    "checked": false
                },
                {
                    "image": "",
                    "option": "E O 4",
                    "checked": false
                }
            ]
        }
    ],
    [
        {
            "question_id": "625",
            "option_type": "1",
            "question_image": "",
            "option_number": "4",
            "correct_answer": "b",
            "marks": "5",
            "language": "Hindi",
            "skill_id": "",
            "nos_id": "34",
            "question": "निम्नलिखित में से कौन सी न्यूनतम ऊंचाई है जिससे ऊपर सुरक्षा बेल्ट पहनना चाहिए?",
            "options": [
                {
                    "image": "",
                    "option": "३ मीटर",
                    "checked": false
                },
                {
                    "image": "",
                    "option": "२ मीटर  ",
                    "checked": false
                },
                {
                    "image": "",
                    "option": "४ मीटर ",
                    "checked": false
                },
                {
                    "image": "",
                    "option": "१ मीटर  ",
                    "checked": false
                }
            ]
        },
        {
            "question_id": "625",
            "option_type": "1",
            "question_image": "",
            "option_number": "4",
            "correct_answer": "b",
            "marks": "5",
            "language": "English",
            "skill_id": "",
            "nos_id": "34",
            "question": "Which of the following is the minimum height at which a safety belt must be worn?  ",
            "options": [
                {
                    "image": "",
                    "option": "English option 1",
                    "checked": false
                },
                {
                    "image": "",
                    "option": "English option 2",
                    "checked": false
                },
                {
                    "image": "",
                    "option": "English option 3",
                    "checked": false
                },
                {
                    "image": "",
                    "option": "English option 4",
                    "checked": false
                }
            ]
        }
    ]
]

我想组合内部数组的对象,获得一个单独的对象数组,并将问题和选项组合成一个对象,如下所示:

代码语言:javascript
复制
question: {
  english: "Identify the symbol used for distribution line"
  hindi: "वितरण लाइन के लिए प्रयुक्त प्रतीक को पहचानें"
}

"options": [
      {
          "image": "",
          "option": {
             "english: "English option 1",
             "hindi: "३ मीटर"
           },
          "checked": false
      },
      {
          "image": "",
          "option": {
             "english: "English option 2",
             "hindi: "२ मीटर  "
           },
          "checked": false
      },
      {
          "image": "",
          "option": {
             "english: "English option 3",
             "hindi: "४ मीटर "
           },
          "checked": false
      },
      {
          "image": "",
          "option": {
             "english: "English option 4",
             "hindi: "१ मीटर  "
           },
          "checked": false
      }
  ]

这是我尝试过的方法。这里我映射的问题就是我从后端得到的问题。

代码语言:javascript
复制
const combinedArray = questions.map((question) => {
  let combined = {};
  let questionObj = {};
  let optionsObj = {};
  question.forEach((languageQ) => {
     combined.question_id = languageQ.question_id;
     combined.u_question_id = languageQ.u_question_id;
     combined.option_type = languageQ.option_type;
     combined.question_image = languageQ.question_image;
     combined.option_number = languageQ.option_number;
     combined.correct_answer = languageQ.correct_answer;
     combined.marks = languageQ.marks;
     combined.skill_id = languageQ.skill_id;
     combined.nos_id = languageQ.nos_id;
     
     if (languageQ.language === 'English') {
            questionObj.english = languageQ.question;
     } else if (languageQ.language === 'Hindi') {
            questionObj.hindi = languageQ.question;
     }
     combined.question = questionObj;
     
     
     languageQ.options.forEach((option) => {
            if (languageQ.language === 'English') {
                optionsObj.english = option.option;
        } else if (languageQ.language === 'Hindi') {
          optionsObj.hindi = option.option;
        }
        option.option = optionsObj;
     });
     
     combined.options = languageQ.options;
  });
  
  return combined;
});

我成功地获得了一个单一的对象数组,问题就像我想要的那样组合在一起,但选项不正确。它只接受选项数组的最后一项。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-06 01:33:13

尝试使用forEach intead (或者reduce )。

代码语言:javascript
复制
var questions = [
   [
    {
        "question_id": "565",
        "option_type": "1",
        "question_image": "",
        "option_number": "4",
        "correct_answer": "d",
        "marks": "4",
        "language": "Hindi",
        "skill_id": "",
        "nos_id": "29",
        "question": "वितरण लाइन के लिए प्रयुक्त प्रतीक को पहचानें",
        "options": [
            {
                "image": "",
                "option": "मौजूदा लाइन",
                "checked": false
            },
            {
                "image": "",
                "option": "योजनाबद्ध लाइन",
                "checked": false
            },
            {
                "image": "",
                "option": "भूमिगत लाइन",
                "checked": false
            },
            {
                "image": "",
                "option": "ओवरहेड लाइन",
                "checked": false
            }
        ]
    },
    {
        "question_id": "565",
        "option_type": "1",
        "question_image": "",
        "option_number": "4",
        "correct_answer": "d",
        "marks": "4",
        "language": "English",
        "skill_id": "",
        "nos_id": "29",
        "question": "Identify the symbol used for distribution line",
        "options": [
            {
                "image": "",
                "option": "E O 1",
                "checked": false
            },
            {
                "image": "",
                "option": "E O 2",
                "checked": false
            },
            {
                "image": "",
                "option": "E O 3",
                "checked": false
            },
            {
                "image": "",
                "option": "E O 4",
                "checked": false
            }
        ]
    }
],
[
    {
        "question_id": "625",
        "option_type": "1",
        "question_image": "",
        "option_number": "4",
        "correct_answer": "b",
        "marks": "5",
        "language": "Hindi",
        "skill_id": "",
        "nos_id": "34",
        "question": "निम्नलिखित में से कौन सी न्यूनतम ऊंचाई है जिससे ऊपर सुरक्षा बेल्ट पहनना चाहिए?",
        "options": [
            {
                "image": "",
                "option": "३ मीटर",
                "checked": false
            },
            {
                "image": "",
                "option": "२ मीटर  ",
                "checked": false
            },
            {
                "image": "",
                "option": "४ मीटर ",
                "checked": false
            },
            {
                "image": "",
                "option": "१ मीटर  ",
                "checked": false
            }
        ]
    },
    {
        "question_id": "625",
        "option_type": "1",
        "question_image": "",
        "option_number": "4",
        "correct_answer": "b",
        "marks": "5",
        "language": "English",
        "skill_id": "",
        "nos_id": "34",
        "question": "Which of the following is the minimum height at which a safety belt must be worn?  ",
        "options": [
            {
                "image": "",
                "option": "English option 1",
                "checked": false
            },
            {
                "image": "",
                "option": "English option 2",
                "checked": false
            },
            {
                "image": "",
                "option": "English option 3",
                "checked": false
            },
            {
                "image": "",
                "option": "English option 4",
                "checked": false
            }
        ]
    }
]
];


function transformQuestion (questions) {
  let questionMap = {};
  let result = [];

  questions.forEach((question) => {
    question.forEach((languageQ) => {

      let combined = {};
      let id = ""+languageQ.question_id;
  
      if (questionMap.hasOwnProperty(id)) {
        combined = questionMap[id];
      } else {
        questionMap[id] = combined;

        combined.question_id = languageQ.question_id;
        combined.u_question_id = languageQ.u_question_id;
        combined.option_type = languageQ.option_type;
        combined.question_image = languageQ.question_image;
        combined.option_number = languageQ.option_number;
        combined.correct_answer = languageQ.correct_answer;
        combined.marks = languageQ.marks;
        combined.skill_id = languageQ.skill_id;
        combined.nos_id = languageQ.nos_id;
      }
  
      combined.question = combined.question || {};
      combined.question[languageQ.language] = languageQ.question;

      combined.options = combined.options || [];

      if (combined.options.length > 0) {
        languageQ.options.forEach((option, ndx) => {
          combined.options[ndx].option[languageQ.language] = option.option;
        });
      } else {
        combined.options = languageQ.options.map((option) => {
          let opt = {};
          opt[languageQ.language] = option.option;
          return {"image": option.image
                 ,"option": opt 
                 ,"checked": option.checked };
        });
      }
    });  
  });  

  Object.keys(questionMap).forEach((key) => {
    if (questionMap.hasOwnProperty(key)) {
      result.push(questionMap[key]); 
    }
  });

  return result;  
}

console.log(transformQuestion(questions));

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63756257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档