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
ループしてチェックする関数を作成します。
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
2017回答:Object.values()ですべての値を確認します。 Array.every()またはArray.some()...などで確認できる値を含む配列を返します。
const isEmpty = Object.values(object).every(x => (x === null || x === ''));
これは私のバージョンで、特にヌル文字列と空の文字列をチェックします(偽りをチェックする方が簡単です)
function isEmptyObject(o) {
return Object.keys(o).every(function(x) {
return o[x]===''||o[x]===null; // or just "return o[x];" for falsy values
});
}
オブジェクトのキーで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
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/
過去の答えを補完するだけです。オブジェクトに配列やオブジェクトが含まれていなくても機能します。存在する場合は、「ディープチェック」を行う必要があります。
そこで、この解決策を思いつきました。 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は「_」としてインポートされます。
それが役に立てば幸い!
他の回答の上に構築して、lodashを使用してオブジェクトのisEmpty
とそのプロパティをチェックします。
const isEmpty = (object) => return _.isEmpty(object) || !Object.values(object).some(x => !_.isEmpty(x))
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
それが役立つことを願っています=)
これは私と完全に機能します:
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を返します。
これにより、空、未定義、nullのオブジェクトのすべてのキーが得られます
Object.keys(obj).filter((k)=> {
if (obj[k] === "" || obj[k]===undefined || obj[k]===null) {
return k;
}
});
これは関数属性をスキップします
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
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
}