Вот мое собственное решение для курса freeCodeCamp Intermediate Algorithm Scription, задача состоит в том, чтобы сравнить два массива.
Инструкция
Полная инструкция выглядит так:
«Сравните два массива и верните новый массив с любыми элементами, найденными только в одном из двух заданных массивов, но не в обоих. Другими словами, вернуть симметричную разницу двух массивов».
Итак, что мы имеем в самом начале — это пустая функция diffArray
с двумя аргументами: arr1
, arr2
:
function diffArray(arr1, arr2) { var newArr = []; return newArr; } diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]);
Также ребята подсказали нам несколько полезных ссылок из документации:
- Операторы сравнения
- Array.prototype.slice()
- Array.prototype.filter()
- Array.prototype.indexOf()
- Array.prototype.concat()
Решение
Первое, что мы сделаем — объединим два массива в один:
var newArr = arr1.concat(arr2); // newArr = [1, 2, 3, 5, 1, 2, 3, 4, 5];
Теперь мы будем фильтровать объединенные newArr
, удаляя неодиночные значения. Как это сделать — я использовал сравнение двух индексов: первого и последнего (спасибо за методы indexOf и lastIndexOf).
function diffArray(arr1, arr2) { // our variable with two array's content var newArr = arr1.concat(arr2); // [1, 2, 3, 5, 1, 2, 3, 4, 5]; return newArr.filter(function(item){ // here we add two indexes var first = newArr.indexOf(item); var last = newArr.lastIndexOf(item); /* if they are same - we allow filter return this values newArr = [1, 2, 3, 5, 1, 2, 3, 4, 5]; iteration 1 2 3 4 5 6 7 8 9 item = 1 2 3 5 1 2 3 4 5 first = 0 1 2 3 0 1 2 7 3 last = 4 5 6 8 4 5 6 7 8 returt 0 0 0 0 0 0 0 1 0 */ return first === last; }); } //and the result will be: diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]); => [4]
И чистый код выглядит так:
function diffArray(arr1, arr2) { var newArr = arr1.concat(arr2); return newArr.filter(function(item){ return newArr.indexOf(item) === newArr.lastIndexOf(item); }); }
Спасибо за чтение.