web-dev-qa-db-ja.com

javascriptオブジェクトのすべての属性がnullまたは空の文字列であるかどうかを判断する

Javascriptオブジェクトのすべての属性がnullまたは空の文字列であるかどうかを判断する最もエレガントな方法は何ですか?任意の数の属性に対して機能するはずです。

{'a':null, 'b':''} //should return true for this object
{'a':1, 'b':''} //should return false for this object
{'a':0, 'b':1} //should return false
{'a':'', 'b':''} //should return true
26
J-bob

ループしてチェックする関数を作成します。

function checkProperties(obj) {
    for (var key in obj) {
        if (obj[key] !== null && obj[key] != "")
            return false;
    }
    return true;
}

var obj = {
    x: null,
    y: "",
    z: 1
}

checkProperties(obj) //returns false
22
tymeJV

2017回答:Object.values()ですべての値を確認します。 Array.every()またはArray.some()...などで確認できる値を含む配列を返します。

const isEmpty = Object.values(object).every(x => (x === null || x === ''));
37
PVermeer

これは私のバージョンで、特にヌル文字列と空の文字列をチェックします(偽りをチェックする方が簡単です)

function isEmptyObject(o) {
    return Object.keys(o).every(function(x) {
        return o[x]===''||o[x]===null;  // or just "return o[x];" for falsy values
    });
}
22
adeneo

オブジェクトのキーでArray.reduceプロトタイプを使用できます。

オブジェクトが次のように構成されていると仮定します。

var obj = {
    x: null,
    y: "",
    z: 1
}

次の手順を使用して、1行だけですべてのプロパティが設定されていないか、空の文字列に設定されているかどうかを確認できます。

Object.keys(obj).reduce((res, k) => res && !(!!obj[k] || obj[k] === false || !isNaN(parseInt(obj[k]))), true) // returns false

すべてのプロパティが設定されているかどうかを確認したい場合は、条件の前に否定を削除し、オブジェクトにキーがある場合にのみ初期結果値をtrueに設定する必要があります。

Object.keys(obj).reduce((res, k) => res && (!!obj[k] || obj[k] === false || !isNaN(parseInt(obj[k]))), Object.keys(obj).length > 0) // returns false as well
6
whirmill

Adeneoの答えに基づいて、1行の条件を作成しました。それが誰かに役立つことを願っています。

var test = {
  "email": "[email protected]",
  "phone": "1234567890",
  "name": "Test",
  "mobile": "9876543210",
  "address": {
      "street": "",
      "city": "",
      "state": "",
      "country": "",
      "postalcode": "r"
  },
  "website": "www.test.com"
};

if (Object.keys(test.address).every(function(x) { return test.address[x]===''||test.address[x]===null;}) === false) {
   console.log('has something');
} else {
   console.log('nothing');
}

テストできます https://jsfiddle.net/4uyue8tk/2/

2
ajilpm

過去の答えを補完するだけです。オブジェクトに配列やオブジェクトが含まれていなくても機能します。存在する場合は、「ディープチェック」を行う必要があります。

そこで、この解決策を思いつきました。 allその値(および値内の値)がundefined、_{}_、または_[]_の場合、オブジェクトは空として評価されます。

_function deepCheckEmptyObject(obj) {
    return Object.values(obj).every( value => {
        if (value === undefined) return true;
        else if ((value instanceof Array || value instanceof Object) && _.isEmpty(value) ) return true;
        else if (value instanceof Array && !_.isEmpty(value)) return deepCheckEmptyArray(value);
        else if (value instanceof Object && !_.isEmpty(value)) return deepCheckEmptyObject(value);
        else return false;
    });
}

function deepCheckEmptyArray(array) {
    return array.every( value => {
        if (value === undefined) return true;
        else if ((value instanceof Array || value instanceof Object) && _.isEmpty(value)) return true;
        else if (value instanceof Array && !_.isEmpty(value)) return deepCheckEmptyArray(value);
        else if (value instanceof Object && !_.isEmpty(value)) return deepCheckEmptyObject(value);
        else return false;
    });
}
_

Lodashの.isEmpty()を使用して、値を「分離」した後、重い作業を行うことに注意してください。ここでは、Lodashは「_」としてインポートされます。

それが役に立てば幸い!

1
Bruno Ribeiro

他の回答の上に構築して、lodashを使用してオブジェクトのisEmptyとそのプロパティをチェックします。

const isEmpty = (object) => return _.isEmpty(object) || !Object.values(object).some(x => !_.isEmpty(x))
1
mkapiczy

TymeJvの回答に基づく=)

function checkProperties(obj) {
var state = true;
  for (var key in obj) {
    if ( !( obj[key] === null || obj[key] === "" ) ) {
        state = false;
        break;
    }
  }
  return state;
}

var obj = {
  x: null,
  y: "",
  z: 1
}

checkProperties(obj) //returns false

それが役立つことを願っています=)

1
Luis García

これは私と完全に機能します:

checkProperties(obj) {
  let arr = [];
  for (let key in obj) {
    arr.Push(obj[key] !== undefined && obj[key] !== null && obj[key] !== "");
  }
  return arr.includes(false);
}

少なくとも1つの値が空またはそのようなものがある場合、これはtrueまたはfalseを返します。

0
nael_d

これにより、空、未定義、nullのオブジェクトのすべてのキーが得られます

Object.keys(obj).filter((k)=> {
  if (obj[k] === "" || obj[k]===undefined || obj[k]===null) {
    return k;
  }
});
0
Jeevan K.A.

これは関数属性をスキップします

function checkIsNull(obj){
                let isNull=true;
                for(let key in obj){
                        if (obj[key] && typeof obj[key] !== 'function') {
                                isNull = false;
                        }
                }
                return isNull;
        }

var objectWithFunctionEmpty={
  "name":undefined,
  "surname":null,
  "fun": function (){ alert('ciao'); }
}

var objectWithFunctionFull={
  "name":undefined,
  "surname":"bla bla",
  "fun": function (){ alert('ciao'); }
}

checkIsNull(objectWithFunctionEmpty); //true
checkIsNull(objectWithFunctionFull); //false
0
Alessandro

Object.values() メソッドを使用して、すべてのオブジェクトの値を(オブジェクトの値の配列として)取得し、この値の配列にnullまたは ""値。 _。includes によって提供されるメソッド- lodash ライブラリ。

const checkObjectProperties = obj => {
  const objValues = Object.keys(obj);

  if (_.includes(objValues, "") || _.includes(objValues, null)) {
    return false;
  } else {
    return true
  }
  
  const incorrectObjProps = { one: null, two: "", three: 78 }
  const correctObjProps = { one: "some string" }
  
  checkObjectProperties(incorrectObjProps) // return false
  checkObjectProperties(correctObjProps) // return true
}
0
Hamza Hmem