如何判断一个变量是空对象、空数组还是空字符串?

How to determine if a variable is an empty object, empty array or empty string?

我有一个对象,它的键值可以是对象、字符串或数组。

const obj = {
  key1: 'asdf',
  key2: {},
  key3: ['a','b','c'],
  key4: [],
  key5: '',
}

我必须过滤所有空键,即空对象、空数组或空字符串。

除了根据 typeof 个键写条件然后检查 null 之外,还有其他方法吗?

您可以使用 Object.keys and reduce

轻松获得结果

使用 Object.keys 遍历对象 objkeys 并仅在新对象不为空时设置新对象的属性

您可以使用 typeof 运算符

检查值的类型

1) string: typeof 将 return string 并检查 length 属性

2) array:可以使用Array.isArray,它会return boolean判断对象是否是一个是否数组

3) object: 你可以先用Object.keys得到所有的key,然后检查上面是否有属性存在对象或不使用 length 属性

由于arrays在JS中是object,所以可以直接使用

(typeof value === "object" && Object.keys(value).length)

检查它在哪里是一个对象以及它是否包含任何 属性 或不

您可以创建过滤器为

if (value !== "" && Object.keys(value).length) acc[key] = value;

const obj = {
  key1: "asdf",
  key2: {},
  key3: ["a", "b", "c"],
  key4: [],
  key5: "",
};

const result = Object.keys(obj).reduce((acc, key) => {
  const value = obj[key];
  if (value !== "" && Object.keys(value).length) acc[key] = value;
  return acc;
}, {});

console.log(result);

对于空字符串,简单比较 属性 和 ""。 比较空对象和空数组可以通过比较 属性 长度的 Object.keys 与 0.

来完成

const obj = {
  key1: 'asdf',
  key2: {},
  key3: ['a','b','c'],
  key4: [],
  key5: '',
}

function filterObject(obj) {
    for (var propName in obj) {
        if (obj[propName] === "" || Object.keys(obj[propName]).length === 0) {
            delete obj[propName];
        }
    }
    return obj;
}

console.log(filterObject(obj));

只需使用 Object.keys()

if (Object.keys(something).length) console.log("Not empty");

这适用于所有字符串、数组,当然还有对象。

您可以查看 Object.keys 文档以获取更多详细信息,特别是 examples section and the non-object coercion 部分,其中声明:

// simple array const arr = ['a', 'b', 'c'];
console.log(Object.keys(arr)); // console: ['0', '1', '2']

// array-like object const obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.keys(obj)); // console: ['0', '1', '2']

In ES5, if the argument to this method is not an object (a primitive), then it will cause a TypeError.

From ES2015 onwards, a non-object argument will be coerced to an object.

// In ES5 Object.keys('foo');  // TypeError: "foo" is not an object

// In ES2015+ Object.keys('foo');  // ["0", "1", "2"]

const obj = {
  key1: 'asdf',
  key2: {},
  key3: ['a','b','c'],
  key4: [],
  key5: '',
}
Object.keys(obj).map(dt => {if (!obj[dt].length) delete obj[dt]});

console.log(obj)