检查typescript中特定对象是否为空

时间:2017-06-02 21:45:21

标签: javascript typescript

如何检查对象是否为空?

例如:

private brand:Brand = new Brand();

我试过了:

if(this.brand)
{
  console.log('is empty');   
}

不工作。

12 个答案:

答案 0 :(得分:10)

使用Object.keys(obj).length检查它是否为空。

输出:3

来源:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

答案 1 :(得分:6)

您可以像这样使用Object.keys

class Brand { }
const brand = new Brand();

if (Object.keys(brand).length === 0) {
  console.log("No properties")
}

如果要检查对象是否至少有一个非空非未定义属性:

  • 使用Object.values()
  • 获取数组中对象的所有值
  • 使用some
  • 检查是否至少有一个值

const hasValues = 
    (obj) => Object.values(obj).some(v => v !== null && typeof v !== "undefined")

class Brand { }
const brand = new Brand();

if (hasValues(brand)) {
  console.log("This won't be logged")
}

brand.name = null;

if (hasValues(brand)) {
  console.log("Still no")
}

brand.name = "Nike";

if (hasValues(brand)) {
  console.log("This object has some non-null, non-undefined properties")
}

答案 2 :(得分:3)

let contacts = {};
if(Object.keys(contacts).length==0){
      console.log("contacts is an Empty Object");
}else{
      console.log("contacts is Not an Empty Object");
}

答案 3 :(得分:2)

您还可以使用lodash来检查对象

if(_.isEmpty(this.brand)){
    console.log("brand is empty")
}

答案 4 :(得分:1)

下面是两个最受欢迎的答案之间的比较,它们的含义确实有所不同:

let o1 = {}
console.log(JSON.stringify(o1) === '{}')
console.log(Object.keys(o1).length === 0)
// true
// true

let o2 = { p: undefined }
console.log(JSON.stringify(o2) === '{}')
console.log(Object.keys(o2).length === 0)
// true
// false

let o3 = { l: null }
console.log(JSON.stringify(o3) === '{}')
console.log(Object.keys(o3).length === 0)
// false
// false

答案 5 :(得分:0)

Object.values(this.brand).some(b => b != null);

答案 6 :(得分:0)

一个好的方法是拥有一个简短的功能,您可以在应用程序的任何地方使用它:

export const isEmpty = (obj) => {
return obj === null || undefined
    ? true
    : (() => {
            for (const prop in obj) {
                if (Object.prototype.hasOwnProperty.call(obj, prop)) {
                    return false;
                }
            }
            return true;
        })();
};

答案 7 :(得分:0)

如果您构建的ECMA 7+可以尝试 Object.entries(obj).length === 0 && obj.constructor === Object

答案 8 :(得分:0)

请注意Object.keysArray.some解决方案,以防您的对象甚至没有初始化且值得null的情况。

还要注意,没有值得undefined的钥匙。

const objNotInitialized = null;

console.log(Object.keys(objNotInitialized));


在这种情况下,您可以添加额外的支票,以得到最终解决方案:

function isEmpty(obj) {
  return !obj || !Object.keys(obj).some(x => obj[x] !== void 0);
}

console.log(isEmpty({
  x: void 0,
}));

console.log(isEmpty(null));

console.log(isEmpty({
  key: 'value',
}));


如果可以使用Object.values

function isEmpty(obj) {
  return !obj || !Object.values(obj).some(x => x !== void 0);
}

console.log(isEmpty({
  x: void 0,
}));

console.log(isEmpty(null));

console.log(isEmpty({
  key: 'value',
}));


const obj = {};

// Using Object.keys to loop on the object keys and count them up
if (!Object.keys(obj).length) {
  console.log('#1 obj is empty');
}

// What if a key worth undefined ?
const objWithUndefinedKey = {
  x: void 0,
};

// Using Object.keys is not enough, we have to check the value behind to remove
// undefined values
if (!Object.keys(objWithUndefinedKey).some(x => objWithUndefinedKey[x] !== void 0)) {
  console.log('#2 obj is empty');
}

// Or more elegant using Object.values
if (!Object.values(objWithUndefinedKey).some(x => x !== void 0)) {
  console.log('#3 obj is empty');
}

// Alternative is to use for ... in
let empty = true;

for (key in objWithUndefinedKey) {
  if (objWithUndefinedKey[key] !== void 0) {
    empty = false;
  }
}

if (empty) {
  console.log('#4 obj is empty');
}

答案 9 :(得分:0)

JSON.stringify(this.brand)==='{}'

答案 10 :(得分:0)

Object.keys(myObject).length == 0

可以使用空属性创建Map obj,并且大小可能不起作用。 对象可能不等于空或未定义

但是使用上面的代码,您可以找到对象是否真的为空

答案 11 :(得分:0)

这是我所知道的最快的结构,尽管它对不循环的循环使用了一些令人费解的(在我的测试中,速度比Object.keys快2倍)

export function isObjectEmpty(object: Record<string, unknown>): boolean {
  for (const property in object) {
    // if any enumerable property is found object is not empty
    return false;
  }

  return true;
}