Porównanie tablicy do tablicy w tablicy

0

Dobranoc ;D

Mam pytanko i proszę o wytłumaczenie ;d

Chciałbym mieć 1 tablice która będzie miała w sobie tablice i te tablice chciałbym porównać do innej tablicy ( czy jest zgodność czy nie). Nie mam pomysłu jak to napisać.... odwoływanie się do konkretnych tablic nic nie daje( za każdym razem mój kochany napis w konsoli i błąd : illegal return statement ).Mógłby ktoś mi napisać jak to zrozumieć + jakiś neutralny łopatologiczny przykład? Nie chce gotowca chciałbym to zrozumieć ;<

0

Może wrzuć dotychczasowy kawałek kodu tutaj albo na jakieś jsfiddle czy innego codepena i wtedy inni zobaczą co zrobiłeś źle...

0

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1