Sei que posso fazer isso usando loops, mas estou tentando encontrar uma maneira elegante de fazer isso:
Eu tenho duas matrizes:
var array1 = [['a', 'b'], ['b', 'c']];
var array2 = [['b', 'c'], ['a', 'b']];
Eu quero usar lodash
para confirmar se as duas matrizes acima são iguais. Por 'o mesmo' quero dizer que não há nenhum item array1
que não esteja contido em array2
.
Em termos de verificação da igualdade entre esses itens:
['a', 'b'] == ['b', 'a']
ou
['a', 'b'] == ['a', 'b']
Ambos funcionam porque as letras estarão sempre em ordem.
fonte
.sort()
muda e sugerindo opções para copiar primeiro, se isso for um problema para o usuário._.isEqual(_.sortBy(array1), _sortBy(array2))
para prevenir a mutação.Você pode usar lodashs
xor
para issoSe você considerar array [1, 1] diferente de array [1], você pode melhorar o desempenho um pouco assim:
fonte
_.xor([3,4], [4,3]).length == 0
você será verdadeiro.Você poderia usar flatten () e diferença () para isso, o que funciona bem se você não se importar se há itens
array2
que não estão emarray1
. Parece que você está perguntando se array1 é um subconjunto de array2 ?fonte
Já existem respostas aqui, mas aqui está minha implementação JS pura. Não tenho certeza se é o ideal, mas com certeza é transparente, legível e simples.
O raciocínio
contains()
é que, sea
contiver todos os elementos deb
, colocá-los no mesmo conjunto não alteraria o tamanho.Por exemplo, se
const a = [1,2,3,4]
econst b = [1,2]
, entãonew Set([...a, ...b]) === {1,2,3,4}
. Como você pode ver, o conjunto resultante possui os mesmos elementos quea
.A partir daí, para torná-lo mais conciso, podemos resumir o seguinte:
fonte
PURE JS (funciona também quando arrays e subarrays têm mais de 2 elementos com ordem arbitrária). Se strings contiver
,
use comojoin('-')
caractere de parâmetro (pode ser utf) que não é usado em stringsExibir trecho de código
fonte
Podemos usar a
_.difference
função para ver se há alguma diferença ou não.Eu espero que isso te ajude.
fonte
true
paraconsole.log(isSame([1,2], [2,3,1]));
a
eb
variáveis. Você única utilizar essas variáveis dentro doif-then
lado, e a primeira coisa que você faz lá é descartar esses valores carregados na linha 2. Eu acho que a seguinte linha única vai funcionar exatamente o mesmo:return arrayOne.length <= arrayTwo.length && _.isEmpty(_.difference(arrayTwo.sort(), arrayTwo.sort());
. E<=
também pode ser melhorado===
._.difference
retornará itens ausentes do primeiro argumento, mas não itens ausentes do segundo. Então, isso vai incorretamente retornartrue
quando você repetir itens em 1º na 2ª:isSame([1, 2, 3], [1, 2, 2])
.Edit: Eu perdi o aspecto multidimensional desta questão, então estou deixando isso aqui no caso de ajudar as pessoas a comparar matrizes unidimensionais
É uma pergunta antiga, mas eu estava tendo problemas com a velocidade de uso de
.sort()
ousortBy()
, então usei esta:Foi planejado para falhar rápido e, para meus propósitos, funciona bem.
fonte
array1.every((str) => array2.includes(str))
deve ser suficiente. Além disso, o OP queria usar o lodash, você deveria pelo menos dizer porque propõe uma solução vanillaJS (... agora que temos tudo e inclui ...). Forneça também um exemplo de como aplicar sua função ao problema fornecido (matrizes bidimensionais).lodash methods to compare arrays without considering order
ver uma alternativa em Javascript moderno. A segunda verificação é necessária, poisarraysContainSameStrings(['1', '2', '2'], ['1', '2', '3'])
, de outra forma, retornaria verdadeiro. Vou deixar aqui, pois pode ajudar, mas agradeço não ter respondido à pergunta