Małe kroczki.
Dwa pytania podstawowe, czyli:
- Jak porównać dwie tablice?
- Co dla nas oznacza równość tablic?
- czy wymagana jest zgodność typów? [1, 2, 3] !== ["1", "2", "3"]
- czy porównujemy rekurencyjnie? [ [1, 2, 3] ] !== [ ["a", "b", "c"] ] ale jeżeli zwracamy uwagę tylko na same typy,
to [ [1, 2, 3] ] === [ ["a", "b", "c"] ], ponieważ elementem i jednej i drugiej tablic jest tablica
- czy wymagana jest tylko zgodność wartości? [1, 2, 3] === ["1", "2", "3"]
- czy wymagana jest kolejność? [1, 2, 3] !== [3, 2, 1]
// Prosty przykład
const tableA = [1, "test", null, undefined, true],
tableB = ["test", 1, undefined, null, true];
// wersja z pętlą
// iterujemy po wszystkich elementach w pierwszej tablicy i sprawdzam czy ten element występuje w drugiej
// jezeli nie to znaczy ze nie są równe i zwracamy false
// w innym wypadku true
const equalsLoop = (arrOne, arrTwo) => {
if(arrOne.length !== arrTwo.length) {
return false;
}
for(let n in arrOne) if(arrOne.hasOwnProperty(n)) {
if(arrTwo.indexOf(arrOne[n]) === -1) {
return false;
}
}
return true;
}
// wersja z funkcją filter
// arrOne.filter(n => arrTwo.indexOf(n) > -1) zwraac tylko te elementy z tablicy pierwsze
// ktore występują w tablicy drugiej
// później porównujemy ich długości
// jezeli tablice są takie same, to dłgość przed filtorwaniem i po filtrowaniu powinan byc identyczna
// to znaczy, że nic nie usunęlismy i wszystkie elemeny z tablicyA są w tablicyB
const equalsFilter = (arrOne, arrTwo) => arrTwo.length === arrOne.length
&& arrOne.filter(n => arrTwo.indexOf(n) > -1).length === arrOne.length
equalsFilter(tableA, tableB)
// true
equalsLoop(tableA, tableB)
// true
equalsFilter(tableA, [...tableB, "foobar"])
// false
equalsLoop(tableA, [...tableB, "foobar"])
// false
Teraz skoro już wiemy jak porównać dwie tablice, to wystarczy zrobić jedną pętlę po naszej dwuwymiarowej tablicy i sprawdzić czy kazdy jej element równa się z naszyą pojedyńcza tablicą.
Przykład:
const tableC = [
[1, "test", null, undefined, true],
[1, "test", null, undefined, true],
[1, "test", null, undefined, true]
],
tableD = [...tableB, "foo", "bar", "baz"];
// poniższy kod powie nam czy w tablic tableA znajdują się tylko takie elementy jak tableB
tableC.filter(n => equalsFilter(n, tableB)).length === tableC.length
// true
tableC.filter(n => equalsFilter(n, tableD)).length === tableC.length
// false
Polecam poczytać u funkcjach filter
, map
, reduce
, find
itd.