2015-08-06 2 views
0

Задача: Сравните два массива и верните новый массив с любыми элементами, не найденными в обоих исходных массивах. Используйте Array.filter и Array.indexOf для решения этой проблемы.разница между двумя массивами с фильтром javascript

function diff(arr1, arr2) { 
    var newArr = []; 
    //code here 
    return newArr; 
} 

diff([1, 2, 3, 5], [1, 2, 3, 4, 5]); 

Я не уверен, как действовать. Мое решение отличается от вышеизложенного и использует жесткий кодированный массив. Как сделать мой общий?

function arrayNotContains(element){ 
    var arr = [1, 2, 3, 5]; 
    if(arr.indexOf(element) === -1){ 
     return true; 
    }else{ 
     return false; 
    } 
} 

var filtered = [1, 2, 3, 4, 5].filter(arrayNotContains); 
console.log(filtered); 

У меня есть еще одно решение ниже. Это нормально ?

var arr1 = [1,2,3,5]; 
var arr2 = [1,2,3,4,5]; 

var filtered = arr2.filter(function(num) { 
    if (arr1.indexOf(num) === -1) return num; 
}); 
+2

Различие с обоих массивов: http://jsfiddle.net/jxgLj1Lz/ –

ответ

4

Вы хотите использовать closure:

function notContainedIn(arr) { 
    return function arrNotContains(element) { 
     return arr.indexOf(element) === -1; 
    }; 
} 

var filtered = [1, 2, 3, 4, 5].filter(notContainedIn([1, 2, 3, 5])); 
console.log(filtered); // [4] 

Уведомление это просто обобщенный вариант вашего решения, я не говорю, что это на самом деле является правильным решением для symmetricdiff функции. Для этого, как было сказано в вашей проблеме, вам нужно сделать что-то вроде

function symmDiff(a, b) { 
    return a.filter(notContainedIn(b)).concat(b.filter(notContainedIn(a))); 
} 
+0

Спасибо. Скажите, пожалуйста, если второе решение в моем вопросе тоже нормально или нет. – stack1

+1

@ stack1 - Не требует ли спецификация вашего вопроса получить неперекрывающиеся значения из * обоих * массивов? –

+0

@ stack1: Помимо неправильного 'return num' (который tymeJV хотел исправить в его теперь удаленном ответе ?!), подход с таким встроенным выражением функции также полностью прекрасен. Mine - это просто абстракция этого, что делает его более подходящим для случаев, когда вы не хотите/нуждаетесь в явных 'arr1' /' arr2' в своей области. – Bergi