删除对象中的虚假值

问题描述 投票:0回答:5

我试图循环对象中的所有属性并删除所有虚假的属性,然后返回使用

delete
传入的对象。显然我做错了什么......这是我到目前为止编写的代码。

var obj = {
  a: undefined,
  b: "banana",
  c: 0,
  d: false,
  e: "",
  f: "apple",
  g: 23
}

var truthy = function (obj) {
  for (var i in obj) {
  if (obj[i] === null || obj[i] === undefined) {
  delete obj[i];
  }
 } return obj;
}

这是实际问题: 创建一个函数,它接受一个对象,循环遍历它的所有属性,并删除任何虚假的属性。然后返回传入的对象。(提示:删除)

javascript object for-in-loop
5个回答
5
投票
  1. 返回对象是多余的,因为您正在修改传入的对象。如果您想返回一个已过滤掉属性的新对象,请在函数中创建一个新对象并将要保留的属性复制到其中。
  2. 你对“falsy”的定义与JavaScript的不完全一致。如果您想要像其他地方一样的“假”,只需说
    if (!obj[i])
    。当然,假设这就是您想要的,但不考虑
    false
    “虚假”有点愚蠢。

您的实际问题是什么?


3
投票

我会做

_.pickBy(obj, _.identity);
它将返回仅包含真值的对象


0
投票

此处演示:

var obj = {
  a: undefined,
  b: "banana",
  c: 0,
  d: false,
  e: "",
  f: "apple",
  g: 23
}

var truthy = function (obj) {
  for (var i in obj) {
    if (!obj[i]) {
      delete obj[i];
    }
  }
  return obj;
};
console.log(truthy(obj));

因为您使用

===
所以
null
(
''
) 不等于
false
,您的代码只需使用
false
undefined
删除键即可。


0
投票

根据 MDN,

falsy
的意思是:

” 假值是在布尔上下文中计算时转换为 false 的值。

JavaScript 在布尔上下文中使用类型强制。 ”

if (false)
if (null)
if (undefined)
if (0)
if (NaN)
if ('')
if (document.all) [1]

因此,如果您想删除所有

falsy
值,请将条件更改为
if (!obj[i])
,以检查虚假值并在下一行中删除。

参考:

  1. JsFiddle:https://jsfiddle.net/tk589h2s/
  2. 文章:https://developer.mozilla.org/en-US/docs/Glossary/Falsy

0
投票

不完全是OP要求的,但相关,并且与问题标题匹配。这会删除所有虚假值,但返回一个新对象,而不是改变现有对象。如果我不需要递归,这是我通常使用的。

const removeFalsy = (o: object) => {
    return Object.entries(o).reduce((a,[k,v]) => ( !v ? a : (a[k]=v, a)), {})
}

对于偶然发现这个答案并需要这个答案的人来说可能有用。

© www.soinside.com 2019 - 2024. All rights reserved.