Сравнить точно два массива по индексам и заменить значения Javascript
Как можно реализовать сравнение двух массивов равной длины n, так, чтобы элементы которые array1[n] === array2[n], а не так чтобы, array1 = ['a','b','','d'] и array2 = ['a','','b','d'], где у них индексы [2] === [1].
Пробовал реализовать данный перебор элементов массивов через .filter(), но он возвращает не правильное соответствие значений.
let a = ['a', 'b', 'c', 'd'];
let b = ['a', 'b', 'd','c'];
let c = a.filter(n => b.indexOf(n) === -1);
console.log(c) // []
Но ведь это не так. c !== d и d !== с.
Задача. Заменить пробелы на 0, правильное соответствие индексов массива на 4, а не правильное на -1.
Уточнение. Чтобы два массива [...n] и [...m], где n - массив имеет правильные значения, а m - это ответы. Запушить в новый массив правильные значения (на своих позициях) равные 4 (за правильный), не правильные - отнять 1, а пропуск - ничего. Больше даже интересует какими методами надо такое реализовывать, includes & indexOf работают не так просто. filter() возвращает совпадения.
Пример 1. ['a', 'b', 'c', 'd', 'e', 'f',...] и ['a', '', 'd', 'd', 'h', 'a',...] должно вернуть ответ: 4 + 0 -1 + +4 - 1 - 1 = 5
Пример 2.["a", "a", "b", "b"], ["a", "c", "b", "d"] = 6
Пример 3 . ["a", "a", "c", "b"], ["a", "a", "b", ""] = 7
Ответы (1 шт):
let c = a.filter(n => b.indexOf(n) === -1); — indexOf вообще проверяет номер элемента n в массиве b и возвращает -1 только если его там нет. Соответственно, в результате фильтрации останутся только те элементы a которых нет в массиве b.
Но для решения задачи не нужно никаких хитрых переборов. Нужна сумма - считайте сумму:
let real_answers = ['a', 'b', 'c', 'd', 'e', 'f'];
let user_answers = ['a', '', 'd', 'd', 'h', 'a'];
let total_points = 0;
for (let i = 0; i < real_answers.length; i++) {
if (user_answers[i] === "") continue; // +0 ?! Строка пустая - ничего не делать.
total_points += (user_answers[i] === real_answers[i]) ? 4 : -1;
// Совпадают ? будет +4 : иначе -1
}
console.log(total_points);
Если хочется использовать методы массива, здесь вместо filter подходит reduce():
let real_answers = ['a', 'b', 'c', 'd', 'e', 'f'];
let user_answers = ['a', '', 'd', 'd', 'h', 'a'];
let points = user_answers.reduce(function(total, answer, index) {
total += !answer ? 0 : answer === real_answers[index] ? 4 : -1;
// Нет ответа ? 0 : совпадают ? 4 : иначе -1
return total;
}, 0);
// .reduce((sum, e, i) => sum + ( !e ? 0 : e === real_answers[i] ? 4 : -1 ), 0);
console.log(points);