Saya tahu saya bisa melakukannya menggunakan loop, tetapi saya mencoba menemukan cara elegan untuk melakukan ini:
Saya memiliki dua array:
var array1 = [['a', 'b'], ['b', 'c']];
var array2 = [['b', 'c'], ['a', 'b']];
Saya ingin menggunakan lodash
untuk mengonfirmasi bahwa dua larik di atas adalah sama. Yang saya maksud dengan 'sama' adalah bahwa tidak ada item di array1
dalamnya yang tidak terkandung di dalamnya array2
.
Dalam hal memeriksa kesetaraan antara item-item ini:
['a', 'b'] == ['b', 'a']
atau
['a', 'b'] == ['a', 'b']
Keduanya bekerja karena huruf akan selalu teratur.
sumber
.sort()
bermutasi dan menyarankan opsi untuk menyalin terlebih dahulu jika itu masalah bagi pengguna._.isEqual(_.sortBy(array1), _sortBy(array2))
untuk mencegah mutasi.Anda bisa menggunakan lodash
xor
untuk iniJika Anda menganggap array [1, 1] berbeda dari array [1] maka Anda dapat meningkatkan kinerja sedikit seperti ini:
sumber
_.xor([3,4], [4,3]).length == 0
akan membuat Anda menjadi kenyataan.Anda bisa menggunakan flatten () dan difference () untuk ini, yang berfungsi dengan baik jika Anda tidak peduli jika ada item
array2
yang tidak diarray1
. Kedengarannya seperti yang Anda tanyakan apakah array1 merupakan subset dari array2 ?sumber
Sudah ada jawaban di sini, tapi inilah implementasi JS murni saya. Saya tidak yakin apakah ini optimal, tetapi pasti transparan, dapat dibaca, dan sederhana.
Alasannya
contains()
adalah jikaa
memang mengandung semua elemenb
, maka menempatkannya ke dalam himpunan yang sama tidak akan mengubah ukurannya.Misalnya, jika
const a = [1,2,3,4]
danconst b = [1,2]
, makanew Set([...a, ...b]) === {1,2,3,4}
. Seperti yang Anda lihat, set yang dihasilkan memiliki elemen yang sama dengana
.Dari situ, agar lebih ringkas, kita bisa meringkasnya menjadi berikut ini:
sumber
PURE JS (juga berfungsi jika array dan subarrays memiliki lebih dari 2 elemen dengan urutan arbitrer). Jika string berisi
,
use asjoin('-')
parametr character (can be utf) yang tidak digunakan dalam stringTampilkan cuplikan kode
sumber
Kita bisa menggunakan
_.difference
fungsi untuk melihat apakah ada perbedaan atau tidak.Saya harap ini akan membantu Anda.
sumber
true
untukconsole.log(isSame([1,2], [2,3,1]));
a
danb
variabel. Anda hanya menggunakan variabel tersebut dalamif-then
bagian, dan hal pertama yang Anda lakukan di sana adalah membuang nilai-nilai dimuat pada baris 2. Saya pikir satu baris berikut akan bekerja persis sama:return arrayOne.length <= arrayTwo.length && _.isEmpty(_.difference(arrayTwo.sort(), arrayTwo.sort());
. Dan<=
juga bisa ditingkatkan menjadi===
._.difference
akan mengembalikan item yang hilang dari argumen pertama, tetapi tidak ada item yang hilang pada argumen kedua. Jadi ini tidak benar akan kembalitrue
ketika Anda mengulang item pada tanggal 1 di 2:isSame([1, 2, 3], [1, 2, 2])
.Sunting: Saya melewatkan aspek multi-dimensi dari pertanyaan ini, jadi saya meninggalkan ini di sini jika itu membantu orang membandingkan array satu dimensi
Ini pertanyaan lama, tapi saya mengalami masalah dengan kecepatan penggunaan
.sort()
atausortBy()
, jadi saya menggunakan ini sebagai gantinya:Itu dimaksudkan untuk gagal dengan cepat, dan untuk tujuan saya berfungsi dengan baik.
sumber
array1.every((str) => array2.includes(str))
Seharusnya cukup. Juga OP ingin menggunakan lodash, Anda setidaknya harus mengatakan mengapa Anda mengusulkan solusi vanillaJS (... sekarang kami memiliki semua dan termasuk ...). Berikan juga contoh bagaimana menerapkan fungsi Anda ke masalah yang disediakan (array 2 dimensi).lodash methods to compare arrays without considering order
melihat alternatif dalam Javascript modern. Pemeriksaan kedua diperlukan karenaarraysContainSameStrings(['1', '2', '2'], ['1', '2', '3'])
akan mengembalikan nilai true jika tidak. Saya akan meninggalkannya di sini, karena mungkin membantu, tetapi saya menghargai saya belum menjawab pertanyaannya