2014-03-31 3 views
4

Если бы я сказал: «В чем разница между этими массивами? ['A'] и ['a', 'b']?" вы бы сказали «b» правильно?Почему разница подчеркивания работает только в одном направлении

Мне было интересно, в чем причина, по которой подчеркивание не имеет двунаправленной дифференциации по умолчанию? И как бы вы объединили другие методы для достижения этого?

var a = ['js-email'], 
    b = ['js-email', 'form-group'], 
    c = _.difference(a, b), // result: [] 
    d = _.difference(b, a); // result: ["form-group"] 

http://jsfiddle.net/GH59u/1/

Для уточнения я хотел бы разницу всегда равна ['form-group'] независимо от того, в каком порядке массивы передаются.

+1

Что вы подразумеваете под асимметричным разложением? – thefourtheye

+0

@thefourtheye Я отредактировал Q, пожалуйста, просмотрите последнее предложение –

ответ

5

Вы можете комбинировать различия между двумя элементами в двух направлениях.

function absDifference(first, second) { 
    return _.union(_.difference(first, second), _.difference(second, first)); 
} 

console.assert(absDifference(["a", "b"], ["a", "c"]).toString() == "b,c"); 
var a = ["js-email"], b = ["js-email", "form-group"]; 
console.assert(absDifference(a, b).toString() == "form-group"); 

Если вы хотите, чтобы это было доступно в рамках _ самой библиотеки, на протяжении всего проекта, то вы можете использовать _.mixin как это

_.mixin({ 
    absDifference: function(first, second) { 
     return _.union(_.difference(first, second), _.difference(second, first)); 
    } 
}); 

, а затем

console.assert(_.absDifference(["a", "b"], ["a", "c"]).toString() == "b,c"); 
var a = ["js-email"], 
    b = ["js-email", "form-group"]; 
console.assert(_.absDifference(a, b).toString() == "form-group"); 
2

.difference, так же как функция PHP array_diff и другие подобные ей, возвращает все элементы, которые находятся в первом массиве, которые не отображаются в любые другие массивы, переданные ему.

Это означает, что «вещи в a, которые не находятся в b», сильно отличаются от «вещей в b, которые не находятся в« и по уважительной причине »- это ожидаемое поведение.

Если вам нужна то, что по существу является двунаправленной разницей, вам нужно будет запустить функцию в обоих направлениях, а затем вырезать дубликаты в результате.

0

_.difference принимает переменное число массивов в качестве аргумента:

Аналогично без, но возвращает значения из массива, которые не присутствуют в других массивах

Так что позволяет только одно направленная работа по дизайну.

Смежные вопросы