如何确定变量是空对象、空数组还是空字符串?

3

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

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

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

除了编写基于键的typeof的条件并检查null之外,还有其他方法吗?

4个回答

5

只需使用 Object.keys()

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

这适用于所有字符串、数组以及当然也包括对象。

您可以查看Object.keys文档了解更多详细信息,特别是示例部分和非对象强制转换部分,其中指出:

// 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"]

2
but not for numbers - pilchard
但是数字本来就不能是空的。此外,问题明确说明:“可以是对象、字符串或数组。” - mmdts
如果您将此测试用作“为空”的通用测试,则所有数字都为空,但是您指出OP只寻找字符串/对象/数组的观点是公正的。(另外0为假值,那么它是否为空?) - pilchard

1

对于空字符串,只需将属性与""进行简单比较即可。 要比较空对象和空数组,可以使用比较属性长度的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));


0

你可以使用 Object.keysreduce 轻松地实现结果

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

您可以使用 typeof 运算符检查值的类型

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

2) array: 您可以使用 Array.isArray,它将返回一个布尔值,指示对象是否为数组

3) object: 您可以首先使用 Object.keys 获取所有键,然后使用 length 属性检查该对象上是否存在任何属性

由于在JS中,数组是一个对象,因此您可以直接使用它们。

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


0

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)


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