确定 JavaScript 对象上的所有属性是否为 null 或空字符串。

107
什么是最优雅的方法来确定一个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

1
无论如何,您都必须循环遍历对象中的所有元素并检查每个元素。 - wmock
20个回答

194

使用Object.values检查所有的值。它返回一个值数组,你可以使用Array.prototype.everyArray.prototype.some来检查:

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

8
检查一个对象的所有值是否为真:Object.values(object).every(x => !!x)。 - Jonathan Meguira
1
@JonathanMeguira 这不是OP所要求的。检查falsy包括更多内容,而不仅仅是空字符串或null。 - PVermeer
2
@abd995 这不正确。someevery都是同样高效和快速的。它们都实现了短路评估:一旦some遇到一个条件不成立的值,迭代就会停止,但同样的事情也适用于every - Sebastian Simon
1
array.some(Boolean)array.every(Boolean)在这里也表现出色(不过要注意0)。 - darcher

79
创建一个函数来循环和检查:
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
@ J-Bob:这个或者adeneo的答案应该可以让你开始。如果你也想允许undefined,把=== null改成== null。你可能需要添加一个hasOwnProperty检查,具体取决于你是否关心原型中的属性。(adeneo的答案只检查“自有”属性,tymeJV的答案既检查“自有”属性又检查原型)。或者,如果需要,可以检查忽略引用函数的属性。 - T.J. Crowder

30

这是我的版本,特别检查了空值和空字符串(只检查假值会更容易)

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

14
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

4
虽然这段代码可能回答了问题,但提供关于为什么或者如何回答问题的额外上下文会提升它的长期价值。 - β.εηοιτ.βε

10

快速简单的解决方案:

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

{'a':'', 'b':''}会返回false。OP希望返回true。 - undefined

9

使用 Array.some() 并检查值是否不为 null 和不为空比使用 Array.every() 并以相反的方式检查更加高效。

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

这个回答只是为了让用户abd995的卓越评论更加明显。


1
那个评论是错误的。两种方法同样有效。 - Sebastian Simon

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

5

根据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/


5

补充之前的回答:如果你的对象不包含数组或对象,则它们将起作用。如果包含,你需要进行“深度检查”。

因此,我想出了这个解决方案。如果所有值(以及值内部的值)都是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被导入为“_”。

希望这可以帮到您!


4

如果您只想查找对象中为空的值,

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接