Я знаю, что могу делать это с помощью циклов, но я пытаюсь найти элегантный способ сделать это:
У меня есть два массива:
var array1 = [['a', 'b'], ['b', 'c']];
var array2 = [['b', 'c'], ['a', 'b']];
Я хочу использовать, lodash
чтобы подтвердить, что два вышеуказанных массива одинаковы. Под «таким же» я подразумеваю, что в нем нет элемента, array1
который не содержится в array2
.
Что касается проверки равенства между этими элементами:
['a', 'b'] == ['b', 'a']
или
['a', 'b'] == ['a', 'b']
Оба работают, так как буквы всегда будут в порядке.
источник
.sort()
изменяются, и предлагаются варианты копирования, если это проблема для пользователя._.isEqual(_.sortBy(array1), _sortBy(array2))
предотвратить мутацию.Вы можете использовать
xor
для этого lodashsЕсли вы считаете, что array [1, 1] отличается от array [1], вы можете улучшить производительность примерно так:
источник
_.xor([3,4], [4,3]).length == 0
вы получите правду.Вы можете использовать Flatten () и разности () для этого, который хорошо работает , если вы не волнует , если есть элементы , в
array2
которые не являются вarray1
. Похоже, вы спрашиваете, является ли array1 подмножеством array2 ?источник
Здесь уже есть ответы, но вот моя чистая реализация JS. Я не уверен, что это оптимально, но он уверен, что он прозрачен, удобочитаем и прост.
Обоснование в
contains()
том, что, еслиa
он содержит все элементыb
, то помещение их в один и тот же набор не изменит размер.Например, если
const a = [1,2,3,4]
иconst b = [1,2]
, тоnew Set([...a, ...b]) === {1,2,3,4}
. Как видите, получившийся набор содержит те же элементы, что иa
.Оттуда, чтобы сделать его более кратким, мы можем свести его к следующему:
источник
PURE JS (работает также, когда массивы и подмассивы содержат более 2 элементов в произвольном порядке). Если строки содержат символ
,
use какjoin('-')
параметр (может быть utf), который не используется в строкахПоказать фрагмент кода
источник
Мы можем использовать
_.difference
функцию, чтобы увидеть, есть ли разница или нет.Я надеюсь, что это поможет вам.
источник
true
заconsole.log(isSame([1,2], [2,3,1]));
a
иb
переменные. Вы только использовать эти переменные внутриif-then
части, и первое , что вы делаете там сбросить эти значения , погруженные в строке 2. Я думаю , следующие одна линия будет работать точно так же:return arrayOne.length <= arrayTwo.length && _.isEmpty(_.difference(arrayTwo.sort(), arrayTwo.sort());
. И<=
его также можно улучшить в===
._.difference
вернет недостающие элементы 1-го аргумента, но не пропущенные элементы 2-го. Так что это будет неправильно вернуться ,true
когда вы повторите пункты с 1 по 2:isSame([1, 2, 3], [1, 2, 2])
.Изменить: я пропустил многомерный аспект этого вопроса, поэтому оставляю его здесь на случай, если он поможет людям сравнивать одномерные массивы
Это старый вопрос, но у меня были проблемы со скоростью использования
.sort()
илиsortBy()
, поэтому я использовал его вместо:Он должен был быстро выйти из строя, и для моих целей работает нормально.
источник
array1.every((str) => array2.includes(str))
должно хватить. Также OP хотел использовать lodash, вы должны хотя бы сказать, почему вы предлагаете решение vanillaJS (... теперь, когда у нас есть все и включает ...). Также предоставьте пример того, как применить вашу функцию к указанной проблеме (двумерные массивы).lodash methods to compare arrays without considering order
альтернативу в современном Javascript. Вторая проверка необходимаarraysContainSameStrings(['1', '2', '2'], ['1', '2', '3'])
, иначе вернет true. Я оставлю его здесь, так как это может помочь, но я понимаю, что не ответил на вопрос