İki dizinin aynı değerlere sahip olup olmadığını nasıl anlarım?


107

Bu iki diziye sahibim: biri ajax isteğinden gelen bilgilerle dolu, diğeri kullanıcının tıkladığı düğmeleri saklıyor. Bu kodu kullanıyorum (örnek numaralarla doldurdum):

var array1 = [2, 4];
var array2 = [4, 2]; //It cames from the user button clicks, so it might be disordered.
array1.sort(); //Sorts both Ajax and user info.
array2.sort();
if (array1==array2) {
    doSomething();
}else{
    doAnotherThing();
}

Ancak false, iki dizi aynı olsa da, ancak farklı bir adla her zaman verir . (Bunu Chrome'un JS Konsolunda kontrol ettim). Öyleyse, bu iki dizinin aynı olup olmadığını bilmemin bir yolu var mı? Neden veriyor false? İlk dizideki hangi değerlerin ikinci dizide olmadığını nasıl bilebilirim?


1
Dizilerin her bir elemanından geçmeniz gerektiğine oldukça eminim.
Thomas Li

Neden yanlış döndürdüğünü biliyor musunuz? Meraklı.
RobW

@Andrew'in yanıtını görün stackoverflow.com/a/6229263/702565
Carlos Precioso

Yanıtlar:


36
function arraysEqual(_arr1, _arr2) {

    if (!Array.isArray(_arr1) || ! Array.isArray(_arr2) || _arr1.length !== _arr2.length)
      return false;

    var arr1 = _arr1.concat().sort();
    var arr2 = _arr2.concat().sort();

    for (var i = 0; i < arr1.length; i++) {

        if (arr1[i] !== arr2[i])
            return false;

    }

    return true;

}

Bunun, önceki yanıtın aksine orijinal dizileri değiştirmediğini unutmayın.


2
sıralama nlog (n) zaman alır. Sıralamaya ihtiyacınız yok. Bu yanıt stackoverflow.com/a/55614659/3209523 doğrusal zamanda çalışır.
canbax

TypeScript kullanıldığında Array.isArray () hatalara neden oluyordu, kaldırılarak sorunsuz çalışıyordu.
Ariel Frischer

91

Dizi öğeleriniz nesne değilse - örneğin sayılar veya dizeler ise, herhangi bir sırayla aynı üyelere sahip olup olmadıklarını görmek için birleştirilmiş dizelerini karşılaştırabilirsiniz.

var array1= [10, 6, 19, 16, 14, 15, 2, 9, 5, 3, 4, 13, 8, 7, 1, 12, 18, 11, 20, 17];
var array2= [12, 18, 20, 11, 19, 14, 6, 7, 8, 16, 9, 3, 1, 13, 5, 4, 15, 10, 2, 17];

if(array1.sort().join(',')=== array2.sort().join(',')){
    alert('same members');
}
else alert('not a match');

2
Bu, benzersiz olarak tanımlayıcı toString değerlerine sahip ilkel öğeler veya nesneler için iyi çalışır, ancak yalnızca herhangi bir nesne için geçerli değildir.
devios1

Teşekkürler! temiz çözüm
Gaston Sanchez

3
Boş öğelere ve sıralamaya dikkat edin. Benim durumumda ", 2,2,3" ve "2,2,3" gibi karşılaştırılacak dizelerle sonuçlandım, ki bunlar kesinlikle eşit değildir.
barbara.post

2
Dizeler için başarısız olabilir, yani ['a', 'b']ve ['a,b']. Bu tekniği yalnızca küçük atılabilir komut dosyaları için öneririm.
alex

1
@alex - benim durumumda, dizelerde virgüllere izin verilir, ancak noktalı virgüllere izin verilmez, bu yüzden ';' virgül yerine katılmak için
a2345

45

Yalnızca iki dizinin aynı değerlere sahip olup olmadığını kontrol etmek istiyorsanız (her bir değerin oluşum sayısına ve sırasına bakılmaksızın), lodash kullanarak bunu yapabilirsiniz :

_.isEmpty(_.xor(array1, array2))

Kısa, basit ve güzel!


1
xorAlt çizgi belgelerinde bulamıyorum . IODash'ı mı düşünüyorsun?
Patrick Mencias-lewis

44
Array.prototype.compare = function(testArr) {
    if (this.length != testArr.length) return false;
    for (var i = 0; i < testArr.length; i++) {
        if (this[i].compare) { //To test values in nested arrays
            if (!this[i].compare(testArr[i])) return false;
        }
        else if (this[i] !== testArr[i]) return false;
    }
    return true;
}

var array1 = [2, 4];
var array2 = [4, 2];
if(array1.sort().compare(array2.sort())) {
    doSomething();
} else {
    doAnotherThing();
}

Olabilir?


Teşekkür ederim! İstendiği gibi çalışır. İşlevi biraz değiştirdim, böylece kaç tane uyuşmazlık olduğunu da öğrenebilirim.
Carlos Precioso

[2,4] [4,2] için yanlış.
Suraz Khanal

@SurazKhanal Hala sıralamanız gerekiyor
Aaron McMillin

28

Kodunuz neden çalışmadı

JavaScript, ilkel veri türlerine ve ilkel olmayan veri türlerine sahiptir.

İlkel veri tipleri için, ==ve ===kontrol çubukları her iki tarafta şeyler aynı değere sahip olup. Bu yüzden 1 === 1doğrudur.

Diziler gibi ilkel olmayan veri türleri için ==ve ===referans eşitliğini kontrol edin. Yani olup olmadığını kontrol olduğunu arr1ve arr2aynı nesne bulunmaktadır. Örneğinizde, iki dizi aynı sırayla aynı nesnelere sahiptir, ancak eşdeğer değildir.

Çözümler

İki diziler, arr1ve arr2aynı üyelerini ancak ve ancak vardır:

  • İçindeki her şey arr2içindearr1

VE

  • İçindeki her şey arr1içindearr2

Yani bu hile yapacak (ES2016):

const containsAll = (arr1, arr2) => 
                arr2.every(arr2Item => arr1.includes(arr2Item))

const sameMembers = (arr1, arr2) => 
                        containsAll(arr1, arr2) && containsAll(arr2, arr1);

sameMembers(arr1, arr2); // `true`

Alt Çizgi kullanan bu ikinci çözüm , yapmaya çalıştığınız şeye daha yakın:

arr1.sort();
arr2.sort();

_.isEqual(arr1, arr2); // `true`

İşe yarıyor çünkü isEqual"derin eşitliği" kontrol ediyor, yani sadece referans eşitlikten daha fazlasına bakıyor ve değerleri karşılaştırıyor.

Üçüncü sorunuza bir çözüm

Ayrıca hangi şeylerin içinde arr1olmadığını nasıl bulacağınızı sordunuz arr2.

Bunu yapacak (ES2015):

const arr1 = [1, 2, 3, 4];
const arr2 = [3, 2, 1];

arr1.filter(arr1Item => !arr2.includes(arr1Item)); // `[4]`

Ayrıca Alt Çizgi'nin difference: yöntemini de kullanabilirsiniz :

_.difference(arr1, arr2); // `[4]`

GÜNCELLEME

@ Redu'nun yorumuna bakın — benim çözümüm bunun içindir sameMembers, ancak aklınızdaki şeyler sameMembersInOrderde bilinir deepEquals.

GÜNCELLEME 2

Dizilerin üyelerinin sırasını önemsemiyorsanız, ES2015 + 'lardan Setdaha iyi bir veri yapısı olabilir Array. Tehlikeli maymun yamasının nasıl uygulanacağı isSupersetvedifference kullanılacağına ilişkin MDN notlarına bakın .


1
Çözümleriniz yanlış. "İki dizi, arr1 ve arr2, ancak ve ancak şu durumlarda aynı üyelere sahip olur: arr2'deki her şey arr1'de VE arr1'deki her şey arr2'de" bu da yanlıştır. Bu bir dizidir, küme değildir. Öyleyse sameMembers([1,1,2],[2,1,2]);yanlış döndürmeli.
Redu

1
@Redu "aynı üyeler" in ne anlama geldiğine bağlı olduğunu tahmin ediyorum - "aynı üyelere sahip" anlamına geliyor. bence sameMembers([1,1,2],[2,1,2])geri dönmeli true. sameMembersInOrder([1,1,2],[2,1,2])AKA deepEquals([1,1,2],[2,1,2])geri dönmeli false.
Maksimum Heiber

Üçüncü çözümünüz arr1.filter..., yalnızca arr2'nin arr1'in tüm öğelerine sahip olup olmadığını kontrol etmek için işe yarayacaktır, ancak bunun tersi de gerekli değildir.
Aakash Verma

10

Nesne eşitliği kontrolü:JSON.stringify(array1.sort()) === JSON.stringify(array2.sort())

Yukarıdaki test aynı zamanda nesne dizileriyle de çalışır, bu durumda http://www.w3schools.com/jsref/jsref_sort.asp adresinde belgelendiği gibi bir sıralama işlevi kullanılır.

Düz JSON şemalarına sahip küçük diziler için yeterli olabilir.


9

Amacımız temelde 2 dizinin eşit küme olup olmadığını kontrol etmektir. küme , matematiksel olarak tanımlanmış kümedir . En hızlı sıralama asimptotik olarak O (nlog (n)) süresi alır. Yani bir diziyi sıralarsanız, en az O (nlog (n)) süre alacaktır . Ancak bu görevi daha hızlı yapabilirsiniz; bu , bir sözlük veri yapısıyla asimptotik olarak O (n) zaman alır (ortalama durum en kötü durum değil). JS'de sözlük, anahtarları ve değerleri olan bir nesnedir.

/** assumes array elements are primitive types
* check whether 2 arrays are equal sets.
* @param  {} a1 is an array
* @param  {} a2 is an array
*/
function areArraysEqualSets(a1, a2) {
  const superSet = {};
  for (const i of a1) {
    const e = i + typeof i;
    superSet[e] = 1;
  }

  for (const i of a2) {
    const e = i + typeof i;
    if (!superSet[e]) {
      return false;
    }
    superSet[e] = 2;
  }

  for (let e in superSet) {
    if (superSet[e] === 1) {
      return false;
    }
  }

  return true;
}

Bu fonksiyon ilkel türleri dizileri ile çalışır ve varsayar a1ve a2dizilerdir.


Bu, dizilerden birinde tekrarlanan değerlerin olduğu durumu işlemez. egareArraysEqualSets([1, 2, 2], [1, 2])
Chris Kent

Öyle. Konsolda denedim. areArraysEqualSets([1, 2, 2], [1, 2]) trueMatematiksel olarak eşit kümelerdir.
canbax

6

Peki buna ne dersin? ES 2017 sanırım:

const array1 = [1, 3, 5];
const array2 = [1, 5, 3];

const isEqual = (array1.length === array2.length) && (array1.every(val => array2.includes(val)));
console.log(isEqual);

1. koşul, her iki dizinin de aynı uzunluğa sahip olup olmadığını kontrol eder ve 2. koşul, 1. dizinin 2. dizinin bir alt kümesi olup olmadığını kontrol eder. Bu 2 koşulun birleştirilmesi, öğelerin sırasına bakılmaksızın 2 dizinin tüm öğelerinin karşılaştırılmasıyla sonuçlanmalıdır.

Yukarıdaki kod yalnızca her iki dizide de yinelenmeyen öğeler varsa çalışır.


3

Bu iki diziyi karşılaştırdığınızda, içerikleri değil dizileri temsil eden nesneleri karşılaştırırsınız.

İkisini karşılaştırmak için bir işlev kullanmanız gerekecek. Uzunlukların aynı olup olmadığını kontrol ettikten sonra, sadece bir döngü halinde olan ve onu diğeriyle karşılaştıran kendi yazınızı yazabilirsiniz.


3

ES6 kullanarak sığ eşitlik için basit çözüm:

const arr1test = arr1.slice().sort()
const arr2test = arr2.slice().sort()
const equal = !arr1test.some((val, idx) => val !== arr2test[idx])

Her dizinin sığ kopyalarını oluşturur ve sıralar. Daha sonra değerler some()arasında döngü yapmak için kullanır ve arr1testher bir değeri arr2testaynı indekse sahip değerle karşılaştırır . Tüm değerler eşitse, some()döner falseve sırayla olarak equaldeğerlendirilir true.

Ayrıca kullanılabilir every(), ancak bir truesonucu tatmin etmek için dizideki her öğe arasında geçiş yapmak zorunda kalacak , oysa some()eşit olmayan bir değer bulduğu anda kurtulacaktır:

const equal = arr1test.every((val, idx) => val === arr2test[idx])

2

Bir Oyun projesinde basit tamsayı değerlerim
vardı Her dizide daha az sayıda değere sahiptim, ayrıca orijinal diziye dokunulmadan ihtiyaç
duydum Yani, aşağıdakileri yaptım, iyi çalıştı. (Buraya yapıştırmak için kod düzenlendi)

var sourceArray = [1, 2, 3];
var targetArray = [3, 2, 1];

if (sourceArray.length !== targetArray.length) {
    // not equal
    // did something
    return false;
}

var newSortedSourceArray = sourceArray.slice().sort();
var newSortedTargetArray = targetArray.slice().sort();

if (newSortedSourceArray.toString() !== newSortedTargetArray.toString()) { // MAIN CHECK
    // not equal
    // did something
    return false;
}
else {
    // equal
    // did something
    // continued further below
}

// did some more work

return true;

Umarım yardımcı olur.


2

ES6 kullanma

Ramda'nın equalsişlevini kullanacağız , ancak bunun yerine Lodash veya Alt Çizgi'yi kullanabiliriz isEqual:

const R = require('ramda');

const arraysHaveSameValues = (arr1, arr2) => R.equals( [...arr1].sort(), [...arr2].sort() )

Yayılma karşıtlığını kullanarak, orijinal dizileri değiştirmekten kaçınıyoruz ve işlevimizi saf tutuyoruz.


2

reduceAkıllı görünmek için döngüler yerine kullanabilirsiniz , ancak geliştirici arkadaşlarınızın sizi bir zeki olarak düşünmesi riskiyle.

function isArrayContentSame(a, b) {
  if (Array.isArray(a) && Array.isArray(b) && a.length == b.length) {
    a = a.concat().sort()
    b = b.concat().sort()
    return a.reduce((acc,e,i) => acc && e === b[i], true)
  } else {
    return false;
  }
}

1

Diğer çözümlerin çoğu sıralama, O (n * log n) kullanır, kitaplıklar kullanır veya O (n ^ 2) karmaşıklığına sahiptir.

Doğrusal karmaşıklık O (n) olan saf bir Javascript çözümü:

/**
 * Check if two arrays of strings or numbers have the same values
 * @param {string[]|number[]} arr1
 * @param {string[]|number[]} arr2
 * @param {Object} [opts]
 * @param {boolean} [opts.enforceOrder] - By default (false), the order of the values in the arrays doesn't matter.
 * @return {boolean}
 */
function compareArrays(arr1, arr2, opts) {

  function vKey(i, v) {
    return (opts?.enforceOrder ? `${i}-` : '') + `${typeof v}-${v}`
  }

  if (arr1.length !== arr2.length) return false;

  const d1 = {};
  const d2 = {};  
  for (let i = arr1.length - 1; i >= 0; i--) {
    d1[vKey(i, arr1[i])] = true;
    d2[vKey(i, arr2[i])] = true;
  }
  
  for (let i = arr1.length - 1; i >= 0; i--) {
    const v = vKey(i, arr1[i]);
    if (d1[v] !== d2[v]) return false;
  }

  for (let i = arr2.length - 1; i >= 0; i--) {
    const v = vKey(i, arr2[i]);
    if (d1[v] !== d2[v]) return false;
  }

  return true
}

Testler:

arr1= [1, 2]
arr2= [1, 2]
compareArrays(arr1, arr2) => true
compareArrays(arr1, arr2, {enforceOrder: true}) => true
-------
arr1= [1, 2]
arr2= [2, 1]
compareArrays(arr1, arr2) => true
compareArrays(arr1, arr2, {enforceOrder: true}) => false
-------
arr1= [2, 1]
arr2= [1, 2]
compareArrays(arr1, arr2) => true
compareArrays(arr1, arr2, {enforceOrder: true}) => false
-------
arr1= [2, 2]
arr2= [1, 2]
compareArrays(arr1, arr2) => false
compareArrays(arr1, arr2, {enforceOrder: true}) => false
-------
arr1= [1, 2]
arr2= [1, 2, 3]
compareArrays(arr1, arr2) => false
compareArrays(arr1, arr2, {enforceOrder: true}) => false
-------
arr1= ["1"]
arr2= [1]
compareArrays(arr1, arr2) => false
compareArrays(arr1, arr2, {enforceOrder: true}) => false
-------
arr1= ["1", 2]
arr2= [2, "1"]
compareArrays(arr1, arr2) => true
compareArrays(arr1, arr2, {enforceOrder: true}) => false
-------
arr1= []
arr2= []
compareArrays(arr1, arr2) => true
compareArrays(arr1, arr2, {enforceOrder: true}) => true

1
Hey, bu harika bir giriş! Oldukça karmaşık ama mantıklı. Bir sorum var: Big O notasyonuna pek aşina değilim, ama kesinlikle bu algoritma O (2n)? Bunun çok büyük bir fark yarattığını düşünmeyin.
Carlos Precioso

1
@CarlosPrecioso Bu doğru ve O (2n) = O (n). Karmaşıklık sabit bir faktörle
SC1000

Bu compareArrays(['1'], [1])ya da gibi davaları işlemezcompareArrays([2, 2], [1, 2])
Chris Kent

@ SC1000 Örneklerimde yalnızca dizi veya sayı dizisi var.
Chris Kent

@ SC1000 Gerçekten. Her örnekte dizilerin farklı değerleri vardır, ancak işlev true değerini döndürür. Diziler farklı değerlere sahip olduğundan ['1'] ile [1] arasındaki karşılaştırmanın beklenen sonucu yanlış olacaktır. Ayrıca [2, 2] ve [1, 2] farklı değerlere sahip dizilerdir, dolayısıyla beklenen sonuç yanlıştır. Ayrıca, bunu yaparsanız compareArrays([1, 2], [2, 2])yanlış döndürür, böylece işleviniz değişmeli olmaz; Bunun gibi bir işlevde beklenmedik olduğunu hissediyorum.
Chris Kent

0

Prototip Çerçevesini kullanıyorsanız, aynı olduklarını (sıraya bakılmaksızın) bulmak için bir dizinin intersect yöntemini kullanabilirsiniz :

var array1 = [1,2];
var array2 = [2,1];

if(array1.intersect(array2).length === array1.length) {
    alert("arrays are the same!");
}

Bu işe yaramaz - [1,2].intersect([1,2,3]).length === [1,2].lengthdoğru döndürür. Orijinal dizilerin uzunluğunu da karşılaştırmalısınız, göstermek için yazıyı düzenledim.
GMA

Aslında, önerilen düzenlememin yineleme durumunda çalışmadığını yeni fark ettim ... örneğin yanlış dönecek array1 = [1,1,2]; array2 = [1,1,2];... orijinal yanıt bu girdi için başarısız olmaz.
GMA

Bunun tersini yapabilirsiniz_.difference(array1, array2).length;
Vic

0

lütfen bu cevabı kontrol edin

var arr1= [12,18];
var arr2= [12, 18, 20, 11, 19, 14, 6, 7, 8, 16, 9, 3, 1, 13, 5, 4, 15, 10, 2, 17];
for(i=0;i<arr1.length;i++)
{
var array1=arr1[i];
for(j=0;j<arr2.length;j++)
{
    var array2=arr2[j];
    if(array1==array2)
    {
return true;
    }
}
}

2
Bu, birkaç hata dışında bu yanıta işlevsel olarak eşdeğerdir . İlk olarak, bunların tümü bir işlevin içine sarılmalıdır, yoksa returnhiçbir etkisi olmaz. İkinci olarak, sıralı dizileri kontrol etmelisiniz [1,2]ve [2,1]aynı şekilde algılanmayacaktır. Üçüncüsü ve en önemlisi, bu aslında yalnızca bazı öğelerin aynı olup olmadığını kontrol edecektir . Koşullu olmalıdır if (array1!==array2) {return false;}. Belki bu size gelecekte yardımcı olabilir!
Carlos Precioso

1
Ek bir yorum olarak, kod akışının daha iyi anlaşılması ve değişken adlarının daha net anlaşılması için girintiyi kullanmaya çalışın. Örneğin: array1ve array2yeniden adlandırılabilir elem1ve elem2. Bu ipuçlarının ikisi de gelecekte size bol miktarda baş ağrısından kurtulacaktır!
Carlos Precioso

2
Daha fazla incelemede, neden çift döngü? Her iki dizi de aynı uzunlukta olmalıdır ve değilse, doğrudan eşit değildirler. Bu şekilde yalnızca bir döngü kullanabilirsiniz. Şu anda bu kod , birinci dizinin herhangi bir elemanının ikinci dizinin herhangi bir yerinde olup olmadığını kontrol eder . Nasıl uygulamanız gerektiğini görmek için bu yanıtı kontrol edin . JavaScript yolculuğunuzda iyi şanslar!
Carlos Precioso

0

Uzun bir süre sonra cevap vermek, ancak bunun basit bir çözüm ve modern yeni başlayanlar arayan birine yardımcı olacağını umuyoruz.

Şimdi böyle bu kullanarak birden kütüphaneleri elde edebilirsiniz lodash, underscorevb (Bunlar yüzünden basitlik, çoklu özellikleri ve yüksek kullanım için günümüzde projenin bir parçası olur)

Lodash kütüphanesinden kesişimi kullanabilirsiniz.

_.intersection(['2-1', '1'], ['2-2', '3-1', '2-1']); 
// => ['2-1']

Bu, herhangi bir veri türü için çalışacaktır ..


0

İki diziyi karşılaştırmak ve her iki dizide de herhangi bir nesnenin aynı olup olmadığını kontrol etmek istiyorsanız, çalışacaktır. Misal :

Dizi1 = [a, b, c, d]
Dizi2 = [d, e, f, g]

Burada, 'd' her iki dizide de ortaktır, bu nedenle bu işlev gerçek değeri döndürür.

  cehckArray(array1, array2) {
    for (let i = 0; i < array1.length; i++) {
      for (let j = 0; j < array2.length; j++) {
        if (array1[i] === array2[j]) {
          return true;
        }
      }
    }
    // Return if no common element exist 
    return false;
  }

0

Bunu dene

function arraysEqual(arr1, arr2){
    if (!Array.isArray(arr1) || !Array.isArray(arr2) || arr1.length!=arr2.length)
        return false;

    return arr1.length==arr1.filter(word => arr2.includes(word)).length;
}

0

Kabul edilen cevaba göre başka bir yolum var.

function compareArrays(array1, array2) {

    if (
        !Array.isArray(array1)
        || !Array.isArray(array2)
        || array1.length !== array2.length
    ) return false;

    var first = array1.sort().map(value => (String(value))).join();
    var second = array2.sort().map(value => (String(value))).join();

    return first == second ? true : false;
}

Hey, StackOverflow'a hoş geldiniz! Bu cevap bazı durumlarda işe yarayacak olsa da, işe yaramayacağı bazı özel durumlar olacaktır. Öncelikle, .sort () yönteminin orijinal diziyi değiştirdiğine dikkat edin. Günümüzde bu kötü hijyen olarak görülüyor, bu yüzden orijinal yanıt bir kopya oluşturmak için önce .concat () kullanıyor.
Carlos Precioso

İkinci nokta, bu JavaScript'in geri kalanıyla tutarlı bir şekilde çalışmayacaktır. {foo: "bar"} === {foo: "bar"} yanlış döndürür (bunlar ayrı ayrı oluşturulan iki farklı nesnedir); bu yüzden karşılaştırmakArrays ([{foo: "bar"}], [{foo: "bar"}]) da tutarlılık için yanlış döndürmelidir. Ancak, uygulamanızla birlikte, nesnelerin dizgi gösterimi aynı olduğu için true döndürür. Bu istenen bir davranış olabilir ya da olmayabilir, ancak her durumda dikkatli olunması gereken bir davranış.
Carlos Precioso

0

Her ikisinin de aynı öğelere sahip olup olmadığını kontrol etmek için iki Diziyi Karşılaştırma işlevi. Düzensiz olsalar bile ...

Basit diziler için iyidir. [Dize, Sayı, Boolean, null, NaN].

.Sort () kullanmıyorum, orijinal diziyi değiştiriyor. Bazıları bunun kötü olduğunu söylüyor ...

Dikkat. Bu işlev sınırlıdır, "[], {}" Nesnelerini veya bu Dizilerdeki işlevleri karşılaştıramaz, kendi dizileri Nesnelerdir.

   let arraysHasSameElements = (arr1, arr2) => {
        let count =
            // returns counting of occurrences.
            (arr, val) => arr.reduce((count, curr) => (curr === val ? 1 : 0) + count, 0);

        /* this will return true if lengths of the arrays is equal.
           then compare them.*/
        return arr1.length === arr2.length

            // compare arr1 against arr2.
            && arr1.reduce((checks, val) =>

                /*  creating array of checking if a value has equal amount of occurrences
                    in both arrays, then adds true 'check'. */
                checks.concat(count(arr1, val) === count(arr2, val)), [])

                // checking if each check is equal to true, then .every() returns true.
                .every(check => check);
    }

    let arr1 = ['',-99,true,NaN,21,null,false,'help',-99,'help',NaN], 
        arr2 = [null,-99,'',NaN,NaN,false,true,-99,'help',21,'help'];
    arraysHasSameElements(arr1, arr2); //true

    let arr3 = [false,false,false,false,false,false], 
        arr4 = [false,false,false,false,false,false]
    arraysHasSameElements(arr3, arr4); //true


    // here we have uncommented version.
    let arraysHasSameElements = (arr1, arr2) => {
        let count = (arr, val) => arr.reduce((count, curr) => (curr === val ? 1:0) + count, 0);
        return arr1.length === arr2.length && arr1.reduce((checks, val) =>
            checks.concat(count(arr1, val) === count(arr2, val)), []).every(check => check);
    }

-1

İki diziyi karşılaştırmak için Basit Çözüm:

var array1 = [2, 4];
var array2 = [4, 2];

array1.sort();
array2.sort();

if (array1[0] == array2[0]) {
    console.log("Success");
}else{
    console.log("Wrong");
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.