A definição atual de _.without aceita array como o primeiro argumento e, a seguir, qualquer número de args a seguir. Sei que pode ser complicado, mas seria útil se eu pudesse passar outro array como argumento.
A nova funcionalidade funcionaria como
_.sem ([1,2,3], [1,2])
retorna
[3]
Tanto quanto eu sei _.without não funciona profundamente, então pode não ser complicada -
_.sem ([1,2,3, [1]], [1], 1)
retorna
[2, 3, [1]]
Felizmente, o JavaScript tem uma maneira embutida de passar uma função qualquer número de argumentos.
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/function/apply
_.without.apply(_, [1, 2, 3], [1, 2])
Coisa certa! Estúpido de mim, como eu poderia esquecer ...
Parece que precisa ser chamado assim
_.without.apply(_, [[1,2,3], 1, 2])
O que torna isso um pouco complicado (removendo a matriz de exclusão com a matriz original).
ATUALIZAÇÃO: criei um novo tíquete para esse problema: https://github.com/documentcloud/underscore/issues/issue/118
Eu tenho que concordar com vocês dois: a Jeremy por manter o _.sem assinatura consistente e a Ondrey por achar a solução alternativa proposta por Jeremys um pouco hackeada (parece não funcionar para mim também).
Assim, quero propor a introdução de duas novas funções de sublinhado: _.difference(*arrays)
e _.symdifference(a,b)
: a diferença encontraria todos os elementos do primeiro array que não aparecem nos outros arrays fornecidos, onde _.symdifference () retornaria os elementos que estão em a ou em b, mas não em ambos.
A "inspiração" para essas funções vem do tipo de dados conjunto python e IMHO, elas não devem ser limitadas apenas a matrizes, uma vez que também são aplicáveis a objetos.
Apenas uma maneira rápida de escrever com sublinhado: _.without.apply (_, [x] .concat (y)), retornará uma matriz de valores em x sem os valores em y.
A resposta de @rubenstolk funciona, exceto que ele não comentou seu código, então os sublinhados foram interpretados como itálico. Para as gerações futuras! : railway_car:: rocket:: rainbow:: raised_hands:
_.without.apply(_, [originalArray].concat(removeArray));
Acho que o Github não fazia isso 2 anos atrás @reggi!
Para quem encontra aqui o seu caminho .... _.diferença ([0, 1, 3, 9], [1, 3]); // => [0, 9]
Eu sei que está fechado, mas o operador de propagação do ES6 vai ajudar com isso;)
Para quem não deseja pesquisar o operador de spread ES6 que @agwidarsito mencionou, o que ele está dizendo é que você pode fazer isso no ES6:
const items = [1,2,3,4];
const itemsToRemove = [3,4,5];
const result = _.without(items, ...itemsToRemove);
// result is [1,2]
Obrigado @addisonbgross!
Comentários muito úteis
Para quem encontra aqui o seu caminho .... _.diferença ([0, 1, 3, 9], [1, 3]); // => [0, 9]
De: http://stackoverflow.com/questions/5722254/underscore-js-is-there-a-function-that-produces-an-array-thats-the-difference