Mam przedmiot, który może wyglądać tak:

{
  address: {
    street: undefined,
    country: 'GB'
  },
  givenname: 'Marko',
  surname: null,
}

Chcę wiedzieć, czy wszystkie pola są ustawione lub przynajmniej jeden jest null. Czy jest mądrzejszy / krótszy sposób, aby dotrzeć do JavaScript niż

address.street != null && address.country != null && givenname != null && surname != null

Może coś, co wygląda tak:

// this could return true or false?
nullCheck(address.street, address.country, givenname, surname)
0
Marian Rick 23 lipiec 2020, 15:37

4 odpowiedzi

Najlepsza odpowiedź

Pierwszy jest typowy sposób, aby rzeczywiście iść. Działa świetnie specjalnie, jeśli masz dokładki, jak z maszynopisem.

Drugi jest taki sam, ale z odrobiną nad głową (za każdym razem, gdy wejdziesz / wyjść z funkcji, reklamy odrobiną nad głową), chociaż jest naprawdę niewielki, tylko zauważalny, gdy masz tony iteracji. Możesz dynamicznie wykryć argumenty:

const nullobj = {
    value1: "yay",
    value2: "",
    value3: 23,
    value4: null
};
const obj = {
    value1: "yay",
    value2: "",
    value3: 23,
    value4: "ok"
};

function checkArgumentsNull(...args) {
    for (let v of args) {
        if (v == null) {
            return true;
        }
    }
    return false;
}

console.log("nullobj:", checkArgumentsNull(nullobj.value1, nullobj.value2, nullobj.value3, nullobj.value4));
console.log("obj:", checkArgumentsNull(obj.value1, obj.value2, obj.value3, obj.value4));

Ale jeśli zamierzasz dynamicznie sprawdzać argumenty, możesz sprawdzić dynamicznie dla właściwości, co jest łatwiejsze. Wystarczy zobaczyć edycję , a ten można łatwo przekonwertować na rekurencyjny , który będzie używany dla pod-obiektów . Właściwie wszystkie funkcje można je przekształcić w rekurencyjne po tej zasadzie:

const nullobj = {
    value1: {
        ok: "ok",
        notok: null
    },
    value2: "",
    value3: 23,
    value4: "ok"
};
const obj = {
    value1: {
        ok: "ok",
        notok: "no"
    },
    value2: "",
    value3: 23,
    value4: "ok"
};

function checkPropertiesNull(obj) {
    for (let v in obj) {
        if (obj[v] == null || (typeof obj[v] === "object" && checkPropertiesNull(obj[v]))) {
            return true;
        }
    }
    return false;
}

console.log("nullobj:", checkPropertiesNull(nullobj));
console.log("obj:", checkPropertiesNull(obj));

A ze względu na nowoczesny JavaScript możesz nawet przekazać iterator i możesz sprawdzić dowolne obiekt, który możesz sobie wyobrazić (obiekt, tablice, mapy, zestawy itp.):

const nullobj = {
    value1: "yay",
    value2: "",
    value3: 23,
    value4: null
};
const obj = {
    value1: "yay",
    value2: "",
    value3: 23,
    value4: "ok"
};
const nullarr = ["ok", "yay", null];
const arr = ["ok", "yay", "yay2"];

function checkIteratorNull(it) {
    for (let v of it) {
        if (v == null) {
            return true;
        }
    }
    return false;
}

console.log("nullobj:", checkIteratorNull(Object.values(nullobj)));
console.log("obj:", checkIteratorNull(Object.values(obj)));
console.log("nullarr:", checkIteratorNull(nullarr));
console.log("arr:", checkIteratorNull(arr));
1
Jorge Fuentes González 23 lipiec 2020, 12:59

Tak jest. Możesz użyć typu danych obiekt , a obejmuje metodę tablicy tak:

Object.values(your_object).includes(null)

Spowoduje to powróci true , jeśli obiekt zawiera co najmniej jeden NULL i false , jeśli nie zawiera żadnych .

Ta odpowiedź działa tylko dla obiektów głębokich poziomów 1 poziom.

Dokumentacja obiektu. Array.inCluduje dokumentację

2
Alejov 23 lipiec 2020, 12:44

Możesz użyć Metoda every, biorąc pod uwagę listę zmiennych do sprawdzenia , z wywołaniem zwrotnym, który sprawdza NULL.

let address = {
    street: undefined,
    country: 'GB'
  },
  givenname = 'Marko',
  surname = null;

console.log([address.street, address.country, givenname, surname].every(e => e !== null))

surname = "blah"

console.log([address.street, address.country, givenname, surname].every(e => e !== null))
1
Luke Storry 23 lipiec 2020, 12:44

Możesz użyć .some

const hasAnEmptyValue = (obj) => Object.values(obj).some(value => !value)

const obj1 = {
  address: null,
  givenname: 'Rick',
  surname: 'Sanchez',
}

const obj2 = {
  address: 'Argentina',
  givenname: 'Rick',
  surname: 'Sanchez',
}
    
console.log(hasAnEmptyValue(obj1))

console.log(hasAnEmptyValue(obj2))
1
Mati Tucci 24 lipiec 2020, 14:34