Сравнение двух массивов JS

229
09 июня 2018, 16:20

Разрабатываю приложение типа викторины с вопросами. Не могу решить задачу или решаю ее очень криво. Есть два массива:

Ответы пользователя:

0:{questionId: "1", answerId: "1"}
1:{questionId: "2", answerId: "4"}
2:{questionId: "2", answerId: "6"}
3:{questionId: "3", answerId: "8"}

И правильные ответы:

0:{questionId: "1", answerId: "3"}
1:{questionId: "2", answerId: "4"}
2:{questionId: "2", answerId: "6"}
3:{questionId: "3", answerId: "7"}

Мне нужно сравнить два массива и получить нечто подобное:

0:{questionId: "1", result: false} \\ пользователь дал не правильный ответ
1:{questionId: "2", result: true}  \\ пользователь дал правильный ответ по 
                                      второму вопросу, в нем два варианта 
                                      ответа оба совпали. Иначе false если 
                                      один из ответов не верен 
2:{questionId: "3", result: false} \\ пользователь дал не правильный ответ

Не получается у меня никак этот сделать. Как решить эту задачу?

Моё решение:

@section scripts {
<script>
    $(document).ready(function () {
            let userAnswers = [];
            let answers = [];
            $('#checkResultBtn').click(function () {
                $('input:checked', '.card-body').each(function () {
                    userAnswers.push({
                        questionId: $(this).attr('name'),
                        answerId: $(this).val()
                    });
                });
                console.log(userAnswers);
                console.log(answers);
                diff(userAnswers, answers);

            });
            function diff(userAnswers, answers) {
                userAnswers.forEach(function (userAns) {
                    answers.forEach(function (ans) {
                        if (userAns['questionId'] == ans['questionId']) {
                            if (userAns['answerId'] == ans['answerId'])
                                console.log(true)                          
                            else
                                console.log(false)
                        }
                    });

                });
            }
            @foreach(var answers in Model){
                var answersList = answers.Answers.Where(x => x.Answer == 1);
                   foreach(var answer in @answersList)
                   {
                    <text>
                    answers.push({
                        questionId: '@answer.QuestionId',
                          answerId: '@answer.Id'
                                });
                    </text>
                   }
            }


            });

</script>
}

https://pastebin.com/B2K5z9UX

P. S.
Стоит учесть, что массив со стороны пользователя может по длине не совпадать с массивом правильных ответов.
Пользователь может не ответить на вопрос вообще.

Answer 1

var ans = [ 
  {questionId: "1", answerId: "1"}, 
  {questionId: "2", answerId: "4"}, 
  {questionId: "2", answerId: "6"}, 
  {questionId: "3", answerId: "8"}, 
]; 
 
var keys = [ 
  {questionId: "1", answerId: "3"}, 
  {questionId: "2", answerId: "4"}, 
  {questionId: "2", answerId: "6"}, 
  {questionId: "3", answerId: "7"}, 
]; 
 
var keys2 = Object.create(null); 
 
for (var x of keys) { 
  (keys2[x.questionId] = keys2[x.questionId] || []).push(x.answerId); 
} 
 
for (var x of Object.keys(keys2)) { 
  keys2[x].sort(); 
} 
 
var ans2 = Object.create(null); 
var res = []; 
 
for (var x of ans) { 
  (ans2[x.questionId] = ans2[x.questionId] || []).push(x.answerId); 
} 
 
for (var x of Object.keys(ans2)) { 
  res.push({questionId: x, result: ans2[x].sort() + '' == keys2[x]}); 
} 
 
console.log(res);
.as-console-wrapper.as-console-wrapper { max-height: 100vh }

Answer 2

let userAnswers = { 
  1: [1], 
  2: [4, 6], 
  3: [8] 
}; 
 
let rightAnswers = { 
  1: [3], 
  2: [4, 6], 
  3: [7], 
  10: [9, 8] 
}; 
 
console.info(diff()); 
 
function diff() { 
  let result = {}; 
   
  for(let [qID, answers] of Object.entries(rightAnswers)){ 
    result[qID] = qID in userAnswers ? userAnswers[qID].length === answers.length && userAnswers[qID].every((v, i)=> v === answers[i]) : false; 
  } 
   
  return result; 
}

READ ALSO
Проблемы с кодировкой в CRUD приложении

Проблемы с кодировкой в CRUD приложении

При добавлении информации с формы на русском языке в БД высвечиваются непонятные символы

179
Как сделать Post запрос с логином и пароля, после чего Get

Как сделать Post запрос с логином и пароля, после чего Get

как сделать POST запрос с логином и паролем, и после чего сделать get ?

198
Почему клиент не получает ответ?

Почему клиент не получает ответ?

С сервера не приходит ответ, в чем может быть проблема? При этом запрос он видит

200