• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Sprawdzanie czy array zawiera jeden typ wartości

Object Storage Arubacloud
+1 głos
363 wizyt
pytanie zadane 6 kwietnia 2021 w JavaScript przez icytower Bywalec (2,110 p.)
edycja 6 kwietnia 2021 przez icytower

cześć, usiłuję napisać funkcję, która przyjmuje w argumencie jakąś tablicę. Chcę w środku sprawdzić czy podana tablica zawiera jeden typ wartości. zależy mi na tym żeby sprawdzane to było rekurencyjnie. Jeżeli tablica jest wielowymiarowa to ma sprawdzać czy wszystkie tablice wewnątrz zawierają ten sam typ wartości, jeżeli zawiera obiekty to ma sprawdzić strukturę obiektu.
Aktualnie jest to robione poprzez JSON.stringify() niestety to rozwiązanie ma szereg wad i niestety nie nadaje się do korzystania na dłuższą metę. Aktualny kod znajduje się w tym pliku. Starsze wersje można znaleźć na branchu main lub develop. Będę wdzięczny za podpowiedzi :)

1 odpowiedź

+2 głosów
odpowiedź 6 kwietnia 2021 przez niezalogowany

Korzystałeś z revivera przy json parse?

komentarz 6 kwietnia 2021 przez icytower Bywalec (2,110 p.)
w ogóle w żadnym momencie nie używałem JSON.parse() ani z revivera. funkcja ma zwracać true or false.
komentarz 6 kwietnia 2021 przez niezalogowany
function allSameType(arr) {
  let hasSpecifiedTypeOfValues = false
  let typeOfValues
  const values = []

  JSON.parse(JSON.stringify(arr), (key, value) => {
    // Skip checking arrays and objects
    if (value === null || typeof value !== 'object') {

      // Get type of values
      if (!hasSpecifiedTypeOfValues) {
        hasSpecifiedTypeOfValues = true
        typeOfValues = typeof value
      }

      values.push(value)
    }
  })

  return values.every(value => typeof value === typeOfValues)
}

Jeśli zależy Ci na wydajności / sprawdzaniu regexpów / sprawdzaniu, czy obiekt zawiera same tablice, obiekty / pewnie jeszcze innych rzeczach o których nie pomyślałem - to trzeba się tu trochę więcej pobawić

komentarz 8 kwietnia 2021 przez icytower Bywalec (2,110 p.)

rozwiązałem to w końcu w taki sposób:

import kindOf from 'kind-of'; // ulepszony typeof
import { compare } from '../compare'; // funkcja porównująca obiekty
import { typeCheck } from "./typeCheck"; // funkcja tworząca "typ"

export function allSameType(arr: any[]): boolean {

  let result: boolean = true;
  const type: string | Record<string, unknown> = kindOf(arr[0]);


  switch (type) {
    case 'object':

      // @ts-ignore TODO
      result = arr.every(el => compare(type, typeCheck(el)).score);

      break;
    case 'array':

      result = arr.every(el => allSameType(el));

      // if [[1,2,3],['example','values','in','array'], [null, null,null],[]] this return true 
      // TODO 

      break;
    default:

      if (!arr.every(el => type === typeCheck(el))) result = false;

      break;
  }

  return result;
}

nie jest to najlepsze rozwiązanie, ale tymczasowo lepsze niż JSON.stringify()

komentarz 9 kwietnia 2021 przez niezalogowany
Nie za bardzo rozumiem, w czym lepsze?
komentarz 12 kwietnia 2021 przez icytower Bywalec (2,110 p.)

jeżeli użyć JSON.stringify() to takie obiekty:

const obj1 = {
  name: "Martha",
  age: 18,
}
const obj2 = {
  age: 18,
  name: "Martha",
}

będą różne, pomimo, że są takie same.

komentarz 12 kwietnia 2021 przez niezalogowany
Ale tu nie masz sprawdzać, czy obiekty są takie same, tylko czy mają takie same typy w wartościach

Podobne pytania

0 głosów
1 odpowiedź 660 wizyt
0 głosów
1 odpowiedź 114 wizyt
pytanie zadane 22 października 2018 w JavaScript przez Bakr Mądrala (6,850 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...