在TypeScript中检查特定对象是否为空

108

如何检查一个对象是否为空?

例:

private brand: Brand = new Brand();

我试过:

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

不起作用。


2
你想检查品牌是否是一个没有属性或未定义的空对象吗? - adiga
也许它不起作用是因为您的条件测试是否为空,而不是这个品牌 :) 要么尝试if(!this.brand),要么执行console.log('is not empty')。 - JustAndrei
@adiga 我想检查这个对象的属性是否为空。 - Unfra
@Unfra,你能分享一下你的Brand类吗? - adiga
14个回答

191

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

输出:3

来源:Object.keys()


1
@Unfra,您能否将此标记为正确答案?谢谢! - Janos Vinceller
但是如果你想把它移动到一个有用的函数中,我们不知道对象的类型以安全地检查它。 - Jamie Hutber

45
您可以这样使用Object.keys:

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

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

如果您想检查对象是否至少有一个非null、非undefined属性:

  • 使用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")
}


15

以下是两个最流行答案的比较,它们确实有略微不同的含义:

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


12
你也可以使用 lodash 来检查对象。
if(_.isEmpty(this.brand)){
    console.log("brand is empty")
}

5
在JavaScript本地功能中嵌入Lodash似乎有些过度设计。 - Mozgor
@Mozgor Lodash使代码更易读,这是它的主要用例。如果你喜欢浪费时间,那么整个Lodash功能可以用vanilla JS替代 :) - DurkoMatko
2
@DurkoMatko,使用lodash进行深度相等性检查与基本的“是否为空”检查之间存在很大的区别,前者至少需要重新编写几行代码。此外,在已经广泛使用lodash的项目中嵌入lodash来实现相同的基本和本地函数与使用isEmpty也是有区别的。 - Mozgor

10
Object.keys(myObject).length == 0
一个 Map 对象可以使用空属性创建,并且大小可能不起作用。对象可能不等于空或未定义。
但是,通过上述代码,您可以找出一个对象是否真的为空或不为空。

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

6

这是我知道的最快的结构,尽管它使用了有点令人困惑的for...in循环,但它并不真正执行循环(根据我的测试,它比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;
}

2
请注意,如果您的对象尚未初始化且值为null,则需要小心使用Object.keysArray.some解决方案。
还要注意,没有一个键值为undefined。"Original Answer"翻译成"最初的回答"。

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');
}


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

3
这比面向对象的方法慢很多。 - kaznovac

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;
        })();
};

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