Определение, являются ли все атрибуты на объекте JavaScript нулевым или пустой строкой

Каков самый элегантный способ определить, являются ли все атрибуты в объекте javascript нулевыми или пустыми? Он должен работать для произвольного количества атрибутов.

{'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

Ответ 1

Создайте функцию для проверки и проверки:

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

Ответ 2

Ответ 2017: Проверьте все значения с помощью Object.values(). Возвращает массив со значениями, которые можно проверить с помощью Array.every() или Array.some()... и т.д.

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

Ответ 3

Здесь моя версия, в частности проверка нулевой и пустой строк (было бы проще просто проверить наличие ложных данных)

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

Ответ 4

Вы можете использовать прототип Array.reduce на ваших объектных ключах.

Предполагая, что объект структурирован следующим образом:

var obj = {
    x: null,
    y: "",
    z: 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

Ответ 5

На основе ответа adeneo я создал однострочное условие. Надеюсь, что это будет полезно кому-то.

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/

Ответ 6

На основе tymeJv answer =)

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

Надеюсь, что это поможет =)

Ответ 7

Просто дополняя прошлые ответы: они будут работать, если ваш объект не содержит массивов или объектов. Если это произойдет, вам нужно сделать "глубокую проверку".

Поэтому я придумала это решение. Он будет оценивать объект как пустой, если все его значения (и значения внутри значений) не 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 импортируется как '_'.

Надеюсь, поможет!

Ответ 8

Основываясь на других ответах, я бы использовал lodash для проверки isEmpty на объекте, так и на его свойствах.

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

Ответ 9

Это пропустить атрибут функции

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

Ответ 10

Это даст вам все ключи от объекта, который является пустым, неопределенным и нулевым

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

Ответ 11

Это прекрасно работает со мной:

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

Это вернет true или false, если хотя бы одно из значений пустое или что-то в этом роде.

Ответ 12

Вы можете использовать метод Object.values(), чтобы получить все значения объекта (как массив значений объекта), а затем проверить, содержит ли этот массив значений null или " " значения, с помощью метода _.include, предоставленного библиотекой 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
}