Текущее определение _.without принимает массив в качестве первого аргумента, а затем любое количество следующих аргументов. Я знаю, что это может быть сложно, но было бы полезно, если бы я мог передать другой массив в качестве аргумента.
Новая функциональность будет работать как
_.without ([1,2,3], [1, 2])
возвращается
[3]
Насколько я знаю, _.without не работает глубоко, поэтому он не может быть чрезмерно сложным -
_.without ([1,2,3, [1]], [1], 1)
возвращается
[2, 3, [1]]
К счастью, в JavaScript есть встроенный способ передать функции любое количество аргументов.
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/function/apply
_.without.apply(_, [1, 2, 3], [1, 2])
Конечно! Глупый я, как я мог забыть ...
Похоже, это нужно так называть
_.without.apply(_, [[1,2,3], 1, 2])
Это немного усложняет задачу (отмену сдвига массива исключения с исходным массивом).
ОБНОВЛЕНИЕ: я создал новый билет для этой проблемы: https://github.com/documentcloud/underscore/issues/issue/118
Я должен согласиться с вами обоими: с Джереми за то, что _. Без подписи согласован, и с Ондри за то, что предложенный Джеремис обходной путь выглядит немного хакерским (похоже, это тоже не работает для меня).
Таким образом, я хочу предложить введение двух новых функций подчеркивания: _.difference(*arrays)
и _.symdifference(a,b)
: разница обнаружит все элементы в первом массиве, которые не появляются в других предоставленных массивах, где _.symdifference () вернет те элементы, которые находятся либо в a, либо в b, но не в обоих.
«Вдохновение» для этих функций исходит от типа данных набора python, и ИМХО они не должны ограничиваться только массивами, поскольку они также применимы к объектам.
Просто быстрый способ записать его с подчеркиванием: _.without.apply (_, [x] .concat (y)), вернет массив значений в x без значений в y.
Ответ @rubenstolk работает, за исключением того, что он не комментировал свой код, поэтому подчеркивания интерпретируются как курсив. Для будущих поколений! : железнодорожный_кар:: ракета:: радуга:: поднял_хандс:
_.without.apply(_, [originalArray].concat(removeArray));
Я думаю, что Github не делал этого 2 года назад @reggi!
Для тех, кто находит здесь свой путь .... _.difference ([0, 1, 3, 9], [1, 3]); // => [0, 9]
Я знаю, что это закрыто, но оператор распространения ES6 поможет с этим;)
Для тех, кто не хочет искать оператора распространения ES6, упомянутого
const items = [1,2,3,4];
const itemsToRemove = [3,4,5];
const result = _.without(items, ...itemsToRemove);
// result is [1,2]
Спасибо @addisonbgross!
Самый полезный комментарий
Для тех, кто находит здесь свой путь .... _.difference ([0, 1, 3, 9], [1, 3]); // => [0, 9]
От: http://stackoverflow.com/questions/5722254/underscore-js-is-there-a-function-that-produces-an-array-thats-the-difference