2015-05-29 80 views
1

我有两个数组,其中一个是答案,第二个是correctAnswers,我需要查看答案中有多少个元素与correctAnswers数组中的元素相同,并获得百分比有多少“答案”是“正确的”。我怎么做? 数组是这样的:如何比较两个数组以查看它们有多少个相同的元素?

answers = ["Hrtkovci","Lepenica","Dec"] 

correctAnswers = ["Lepenica","Dec","Leskovac"] 

,我不知道这是否是重要的,但一切都与角度。

回答

0

您可以使用angular.forEach要经过两个阵列中的每个项目,并检查它们是否相等。

var app = angular.module('app', []) 
app.controller('MyController', function ($scope) { 

    $scope.answers = ["Hrtkovci", "Lepenica", "Dec"]; 
    $scope.correctAnswers = ["Lepenica", "Dec", "Leskovac"]; 

    $scope.compareArrays = function (arr1, arr2) { 
     var inBoth = []; 
     angular.forEach(arr1, function (a1) { 
      angular.forEach(arr2, function (a2) { 
       if (a1 == a2) { 
        inBoth.push(a1); 
       } 
      }); 
     }); 
     //return inBoth; 
     var correct = 'You got ' + inBoth.length + '/' + arr2.length + ' answers!'; 
     var percentage = 'Correct: ' + ((inBoth.length/arr2.length) * 100).toFixed(2) + '%'; 
     alert(correct + '\n' + percentage); 
    }; 

    $scope.compareArrays($scope.answers, $scope.correctAnswers); 

}); 

编辑:对不起,没有看到你想要正确的答案和百分比。更新小提琴。

Fiddle

+0

它的woorking !!谢谢你! :) – Branka

+1

复杂性是N²,它可以很容易地与2N地图。 –

+0

我低估了什么? – adamjld

2

很简单,你可以循环回答并检查它们。在foreach循环将是:

var nbGoodAnswer = 0; 
answers.forEach(function(answer, index, listAnswer){ 
    if(answer === correctAnswers[index]){ 
     nbGoodAnswer++; 
    } 
}); 

(它可以用一个简单的for太做)

然后:

console.log(nbGoodAnswer + "/" + answers.length +" bonnes réponses"); 
console.log((nbGoodAnswer/answers.length * 100) +"% bonnes réponses"); 

编辑:在另一种情况下,如果你的阵列答案没有排序或者可能不包含所有问题的答案:

var answer = [{question: 3, response: "C"}, {question: 1, response: "A"}]; 
var correctAnswer = [{question: 1, response: "A"}, {question: 2, response: "B"}, {question: 3, response: "C"}, {question: 4, response: "D"}]; 

var mapCorrectAnswerIdQuestion = {}; 
for (var i = 0; i < correctAnswer.length; i++) { 
    mapCorrectAnswerIdQuestion[correctAnswer[i].question] = correctAnswer[i].response; 
} 

// then you count 
var nbGoodAnswer = 0; 
for (var j = 0; j < answer.length; j++) { 
    if(answer[j].response === mapCorrectAnswerIdQuestion[answer[j].question]){ 
     nbGoodAnswer++; 
    } 
} 

复杂性:2N(answer.length + correctAnswer.length)

+1

这假定数组相等,并且它们以相同的顺序 – sirrocco

+0

完全正确。你必须为每个问题/回答都有正确的答案。 –

+0

他可以有一个问题列表,用户只能回答其中的一些问题。或者用户可能会以不同的顺序回答他们。第一个问题2然后问题1 ...问题可能随机出现..等等。很多事情可能会有所不同,你做了太多的假设 – sirrocco

0
array2 = ["Hrtkovci","Lepenica","Dec"] 
array1 = ["Lepenica","Dec","Leskovac"] 
var foo = []; 
var i = 0; 
jQuery.grep(array2, function(el) { 
    if (jQuery.inArray(el, array1) == -1) foo.push(el); 
    i++; 
}); 
alert(" the difference is " + foo); 

有实现这一目标的其他方式。

您可以看到.each jQuery循环遍历数组并根据您的选择进行比较。

但上述方案是干净的,容易的jQuery是所有这样做对我们来说毕竟:d

+0

你我的变量没有做任何事情。 – sirrocco

2
var answers = ["Hrtkovci", "Lepenica", "Dec"], 
    correctAnswers = ["Lepenica", "Dec", "Leskovac"], 
    count = 0, 
    percent; 
correctAnswers.forEach(function (c) { 
    if (answers.some(function (a) { return a === c; })) { 
     count++; 
    } 
}); 
percent = count * 100/correctAnswers.length; 
document.write('Right Answers: '+count + ' Rate: ' + percent.toFixed(2) + ' %'); 
+0

小问题 - correctAnswers.length可能为0 :) – sirrocco

+1

如果没有给出正确的答案,这是没有意义的。 –

+0

因为每个人都有至少一个问题吗?您可能会向用户显示:“正确答案:0率:无穷大%” - 是预期结果? – sirrocco

-1

尝试此

$answers =array("a"=>"Hrtkovci","b"=>"Lepenica","c"=>"Dec"); 

$correctAnswers =array("e"=>"Lepenica","f"=>"Dec","g"=>"Leskovac"); 

$result=array_intersect($answers ,$correctAnswers); 

print_r($result); 
相关问题