【问题标题】:is it possible to make spread operator ignore undefined propperties [duplicate]是否可以让扩展运算符忽略未定义的属性 [重复]
【发布时间】:2021-11-02 10:43:39
【问题描述】:

鉴于以下

[{ a: 5, b: 2 }, { a: 2, b: 5 }].map(x => {
  return {
    ...x,
    b: undefined
  }
})

我想最终得到类似的东西

[{a:5},{a:2})

这可能吗? 我知道我可以做类似的事情

[{ a: 5, b: 2 }, { a: 2, b: 5 }].map(x => {
const obj = {
    ...x,
  }
  delete obj.b
  return obj
})

或

[{ a: 5, b: 2 }, { a: 2, b: 5 }].map(x => {
  return {
    a: x.a
  }
})

第一种方法导致值被设置为“未定义”。 第二种方法对于较大的数组似乎很浪费,因为创建了一个新变量对象,而且我的打字稿也抱怨它,因为原始属性不是可选的。 如果您只想保留少量属性,则第三种方法有效,但是一旦它只保留了一些属性,它就会显得笨拙。 对于我目前的情况,我可能会选择第二种方法,但我很好奇是否有一种方法可以更优雅地处理它。

我知道我也可以这样做:

Object.keys(obj).forEach(key => obj[key] === undefined && delete obj[key])

但它似乎仍然没有那么优雅。

【问题讨论】:

  • rest 参数语法在这种情况下会有所帮助:解构要删除的属性并使用 rest 参数语法收集其余属性。比如:arr.map(({ b, ...restProps }) => { ... })

标签: javascript


【解决方案1】:

您可以忽略b 并收集rest 中的所有属性,然后在最终结果中传播rest。

你也可以把它做成一个班轮

const result = arr.map(({ b, ...rest }) => ({ ...rest }));

const arr = [
  { a: 5, b: 2 },
  { a: 2, b: 5 },
]
const result = arr.map(({ b, ...rest }) => {
  return { ...rest };
});

console.log(result);

【讨论】:

    猜你喜欢
    • 2011-07-27
    • 2021-10-10
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-13
    相关资源
    最近更新 更多