确定javascript对象上的所有属性是空还是空字符串

时间:2014-12-30 17:14:45

标签: javascript object attributes

确定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

16 个答案:

答案 0 :(得分:32)

2017回答:使用Object.values()检查所有值。返回一个数组,其中包含可以使用Array.every()或Array.some()等等检查的值。

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

答案 1 :(得分:20)

创建一个循环和检查的函数:

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 :(得分:20)

这是我的版本,专门检查空字符串和空字符串(更容易检查麻痹)

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

答案 3 :(得分:6)

您可以在对象的键上使用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

答案 4 :(得分:5)

let obj = { x: null, y: "hello", z: 1 };
let obj1 = { x: null, y: "", z: 0 };

!Object.values(obj).some(v => v);
// false

!Object.values(obj1).some(v => v);
// true

答案 5 :(得分:2)

根据adeneo的回答,我创建了单行条件。希望它对某人有所帮助。

var test = {
  "email": "test@test.com",
  "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 :(得分:2)

如果您正在搜索的对象中只有空值,

Object.values({ key: 0, key2: null, key3: undefined, key4: '' }).some(e => Boolean(e))
// false

Object.values({ key: 0, key2: null, key3: undefined, key4: "hello" }).some(e => Boolean(e))
// true

Object.values({ key: 1, key2: "hello" }).some(e => Boolean(e))
// true

答案 7 :(得分:1)

只需补充过去的答案:如果您的对象不包含数组或对象,它们将起作用。如果是这样,则需要进行“深入检查”。

所以我想出了这个解决方案。如果所有对象的值(以及值内部的值)为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 :(得分:1)

使用Array.some()并检查值是否不是null且不是empty比使用Array.every更有效,并检查其他值

const isEmpty = !Object.values(object).some(x => (x !== null && x !== ''));

此答案应仅使用户comment的优秀abd995更加可见。

答案 9 :(得分:0)

基于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

希望有帮助=)

答案 10 :(得分:0)

跳过功能属性



.then(response => response.json())




答案 11 :(得分:0)

在其他答案之上,我将使用lodash来检查对象上的isEmpty及其属性。

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

答案 12 :(得分:0)

这将为您提供来自对象的所有键,这些键为空,未定义和空

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

答案 13 :(得分:0)

这很适合我:

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。

答案 14 :(得分:0)

您可以使用Object.values()方法来获取所有对象的值(作为对象值的数组),然后检查该值的数组是否包含 null “” < / strong>值,借助于_.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
}

答案 15 :(得分:0)

我补充一下我的两种感觉:

Object.values(object).every(value => Boolean(value));