【问题标题】:How to remove `undefined` value from an object如何从对象中删除“未定义”值
【发布时间】:2019-07-15 03:17:33
【问题描述】:

我有一个这样的对象

const obj = {a: 123, b: 'text', c: [1,2,3]}

我将它用于路由参数,但c 可以是一个空数组,我不必处理 a 和 b 因为它们肯定会有价值。我是否必须从obj 中手动省略c?只有{a: 123, b: 'text'}

如果值未定义,有什么方法我不必手动从对象中省略属性?

【问题讨论】:

  • 这个问题我不清楚。你的目标是什么?你有什么问题?包含空数组的对象声明没有任何问题:JavaScript 意义上的 {a: 123, b: 'text', c: []},但不确定您在使用该对象做什么。
  • @jfriend00 如果值未定义,有什么方法我不必手动从对象中省略该属性?
  • 不明白手动省略是什么意思?如何?您要么声明 c 属性,要么不声明。如果您正在使用该对象,您可以检查 c 属性是否存在或者数组是否为空。
  • 你可以做delete obj.c;

标签: javascript object ecmascript-6


【解决方案1】:

如果你使用lodash,你可以使用omitBy

_.omitBy({a: 123, b: 'text', c: undefined}, _.isUndefined)

此外,您可以通过链组合多个条件

_({a:123,b:'text',c:undefined,d:null})
          .omitBy(_.isUndefined)
          .omitBy(_.isNull).value();

或者

你可以引入一个函数来帮助你为每个对象省略未定义的值

const obj = {a: 123, b: 'text', c: undefined};

const omitObj = obj => Object.keys(obj).reduce((acc, key) => {
 if (obj[key] === undefined) {
    return acc;
 }
 acc[key] = obj[key];
 return acc;
}, {})


const newObj = omitObj(obj);
console.log(newObj);

【讨论】:

  • 这个我可以写,我只是好奇有没有lib或者wrapper,这样我就不用手动写了
  • 你可以使用omitBylodash 来做到这一点,刚刚更新了我的答案
  • 如果值为空数组,如何使用lodash omitBy 省略?这不起作用_.omitBy({a: 123, c: []}, a => !a.length === 0)
  • 应该是_.omitBy({a: 123, c: []}, a => a.length === 0)没有!
  • 为什么要使用库来解决这个任务?如果您确定要从现在到永远在这个项目中使用 lodash 之类的东西(或者甚至解决这个问题),那很好,但是这种类型的问题对于像这样的工具来说并不是一个很好的用例lodash,并且正在将您从核心 JS 原则中抽象出来。我并不讨厌你使用工具的愿望,但我很好奇你的原因是什么。
【解决方案2】:

如果你不确定最后一个参数

只做一个条件语句

const obj = {a: 123, b: 'text', c: [1,2,3]}

var AnotherObj = obj
if (AnotherObj.c == undefined)
    delete AnotherObj.c

如果定义了 obj.c,一切都会好起来的

否则它将从对象中删除第三个参数

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    • 2019-10-09
    • 1970-01-01
    • 2021-07-23
    • 2011-02-24
    • 1970-01-01
    • 2014-10-14
    相关资源
    最近更新 更多