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

J-b*_*bob 27 javascript attributes object

确定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
Run Code Online (Sandbox Code Playgroud)

PVe*_*eer 47

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

const isEmpty = Object.values(object).every(x => (x === null || x === ''));
Run Code Online (Sandbox Code Playgroud)

  • 或者更短:Object.values(object).every(x => !!x); (9认同)
  • 使用“ Array.some()”并检查值是否非空比使用“ Array.every()”检查数组中的所有值更有效。特别是在对象具有很多属性的情况下。some()对数组中存在的每个元素执行一次回调函数,直到找到一个回调返回真值的元素为止,在这种情况下,我们知道object是否为空并且不需要检查其余属性。const isEmpty =!Object.values(object).some(x =>(x!== null && x!==''));` (5认同)
  • @abd995 这是不正确的。“some”和“every”同样高效、同样快速。它们都实现了短路求值:一旦“some”达到条件不成立的值,迭代就会停止,是的,但同样的情况也适用于“every”。 (2认同)

tym*_*eJV 30

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

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
Run Code Online (Sandbox Code Playgroud)

  • @ J-Bob:这个或adeneo的答案应该让你开始。如果您还想允许 `undefined`,请将 `=== null` 更改为 `== null`。你可能想也可能不想添加一个 `hasOwnProperty` 检查,这取决于你是否关心原型中的属性。(adeneo 的回答只检查“自己的”属性,tymeJV 的回答“自己的”和原型)。或者可能是检查忽略引用函数的属性(再次,如果需要)。 (2认同)

ade*_*neo 22

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

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


Gau*_*rya 11

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
Run Code Online (Sandbox Code Playgroud)

  • 虽然此代码可以回答问题,但提供有关此代码为何和/或如何回答问题的附加上下文可以提高其长期价值。 (4认同)

Ama*_* C. 10

快速简单的解决方案:

Object.values(object).every(value => !!value);
Run Code Online (Sandbox Code Playgroud)


whi*_*ill 6

您可以在对象的键上使用Array.reduce原型.

假设对象的结构如下:

var obj = {
    x: null,
    y: "",
    z: 1
}
Run Code Online (Sandbox Code Playgroud)

您可以使用以下指令来发现是否所有属性都未设置或仅使用一行设置为空字符串:

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

如果要发现是否设置了所有属性,则必须在条件之前删除否定,并且仅当对象具有键时才将初始结果值设置为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
Run Code Online (Sandbox Code Playgroud)


dea*_*mon 6

使用Array.some()和检查值不null,不empty就是更有效比使用Array.every和周围检查它的其他方式。

const isEmpty = !Object.values(object).some(x => (x !== null && x !== ''));
Run Code Online (Sandbox Code Playgroud)

这个答案应该只是让用户abd995的优秀评论更加明显。


aji*_*lpm 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');
}
Run Code Online (Sandbox Code Playgroud)

你可以测试一下https://jsfiddle.net/4uyue8tk/2/


Bru*_*iro 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;
    });
}
Run Code Online (Sandbox Code Playgroud)

请注意,在我们“隔离”一个值之后,它使用 Lodash.isEmpty()来完成繁重的工作。此处,Lodash 被导入为“_”。

希望能帮助到你!