【问题标题】:Is there a nice way in javascript to removing Falsy values from a javascript object (not an array)?javascript 中是否有一种从 javascript 对象(不是数组)中删除 Falsy 值的好方法?
【发布时间】:2018-07-17 05:35:09
【问题描述】:

在 JavaScript 中,您可以使用很好的 .filter 方法从数组中删除空值或假值。到目前为止,我还没有找到从 JavaScript 对象中删除相同内容的方法。

为什么会这样?

目前您可以为数组创建一个函数,例如:

function stripNulls(arr) {
   return arr.filter(Boolean);
}

是否可以为 JS 对象创建类似的功能,或者过滤器的工作方式在 JS 对象上不实用。

【问题讨论】:

  • 没有像数组一样的对象可枚举。 for...in 循环是您唯一的选择
  • 当前答案就位。您是否更喜欢一种不会像上面的数组推论那样发生变异的方法?
  • 不是很相关,但你的函数名确实有误导性。
  • 你如何使用这些你想“过滤”的对象?

标签: javascript arrays javascript-objects


【解决方案1】:

警告:这里提供了更好的答案。此外,由于使用delete 在用户下方制作的 cmets 可能会提供次优性能。

在对象中过滤无效值稍微复杂一些。从表面上看,这将满足您的需求:

var arr = [ 'apple', 43, false ];
var trueArr = arr.filter(Boolean);

console.log(trueArr);

var obj = { 'title': 'apple', 'id': 43, 'isOrange': false, 'test': 'asd' };
Object.keys(obj)
  .filter(key => !obj[key])
  .forEach(key => delete obj[key]);

console.log(obj);

但是,这不会迭代子对象/函数。此逻辑还直接修改原始对象(可能需要也可能不需要)。

通过将这个逻辑添加到这样的函数中可以很容易地改变这一点:

function removeFalseyProperties(obj) {
  Object.keys(obj)
    .filter(key => !obj[key])
    .forEach(key => delete obj[key]);
    
  return obj;
}

var testObj = { 'title': 'apple', 'id': 43, 'isOrange': false, 'test': 'asd' };
var trutheyObj = removeFalseyProperties(testObj);

console.log(trutheyObj);

【讨论】:

  • 避免delete!
  • @Bergi 为什么我们要避免删除?
  • 公平地说,我将添加一个编辑以影响用户对 Mark 的回答并提及潜在的 delete 性能问题。
【解决方案2】:

“我可以对一个对象执行 x 吗”(或就此而言的一个数组)的答案通常是“是”并且它经常涉及某种形式的 reduce

如果你想过滤虚假值,你可以这样做:

function filterFalsy(obj) {
  return Object.keys(obj).reduce((acc, key) => {
    if (obj[key]) {
      acc[key] = obj[key]
    }

    return acc
  }, {})
}

const testObj = {
  a: 'test',
  b: 321,
  c: false
}

console.log(filterFalsy(testObj))

这将返回一个没有虚假值的新对象,并单独保留现有对象。

【讨论】:

  • 我更喜欢这个实现。我建议进行编辑以提供 sn-p 仅用于概念证明。
  • 没关系。做了一些轻微的风格调整。
【解决方案3】:

falsy 值为 0、未定义、null、false 等。

myArray
    .map(item => {
        // ...
    })
    // Get rid of bad values
    .filter(Boolean);

通过传递布尔值,我们可以删除所有虚假值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    • 2011-07-17
    • 2015-07-30
    • 1970-01-01
    • 2016-11-08
    • 2016-05-19
    相关资源
    最近更新 更多