【问题标题】:ternary operator inside an arrow function inside forEachforEach 内的箭头函数内的三元运算符
【发布时间】:2017-10-06 19:04:16
【问题描述】:

我有这个小功能,它应该删除具有偶数值的对象属性。

function removeEvenValues(obj) {
  Object.keys(obj).forEach(k => ((!isNaN(obj[k])) && (obj[k] % 2 === 0)) ? delete obj[k] : k);
}

在三元运算符的 else {} 部分,如何像 if (true){ doSomething();} 类型的构造那样将其留空?或者在这种情况下使用粗箭头函数是否有意义?

【问题讨论】:

  • 为什么要使用三元?
  • 如果你只想使用 2 个操作数,那么三元(3 个操作数)是没有意义的。
  • @Bergi 真的吗? (他反问)——我敢发誓这件事以前就出现过,我当时一定也查过。 (我几乎从不使用它。)
  • @Pointy:Yup。 :-)

标签: javascript arrays function foreach arrow-functions


【解决方案1】:

是的,你不应该在这里使用简洁的箭头函数或三元运算符。好吧,你could use &&instead of the ternary,但你真的不应该。

shouldn't even use forEach in ES6 - 只需使用适当的循环:

function removeEvenValues(obj) {
  for (const k of Object.keys(obj))
    if (!isNaN(obj[k]) && obj[k] % 2 === 0)
      delete obj[k];
}

或者(因为你可能不关心继承的属性)

function removeEvenValues(obj) {
  for (const k in obj)
    if (!isNaN(obj[k]) && obj[k] % 2 === 0)
      delete obj[k];
}

【讨论】:

  • 可能值得指出inObject.keys 在处理属性方面的不同之处,尤其是delete 不会删除继承的属性。
  • 为什么不应该使用 forEach?这背后的原因是什么?
  • @epascarello forEach 只对副作用有用,对于副作用for … of statements 是更好的解决方案。人们不应该使用forEach 进行循环,他们只是倾向于在其中尝试using breakusing yieldusing await
  • @epascarello:这只是一种意见,而不是普遍接受的规则。如果您愿意,可以在 ES2015+ 中使用 forEach,只要您不需要做它不支持的事情(例如提前停止——在这种情况下,请使用 some)。但是从 ES2015+ 开始,没有充分的 理由 来使用它,除非碰巧你已经有一个可以做你想要的功能,并且for 可以更好地使用一些较新的结构。您不再需要 forEach 来方便地确定循环局部变量的范围,因此您可以通过使用 for 来避免不必要地创建和调用函数。
  • @Bergi 如果他们正在寻找爆发的理由,他们应该使用someevery。所以基本上你个人认为不应该使用 forEach。 ;)
【解决方案2】:

使用粗箭头并没有错,因为它是一个函数表达式,但是因为你没有返回一个值,所以你不应该使用三元运算符。你可以这样做:

function removeEvenValues(obj) {
    Object.keys(obj).forEach(k => {if(!isNaN(obj[k]) && (obj[k] % 2 === 0)) {delete obj[k]}});
}

【讨论】:

  • 或者如果你觉得非常需要避免if&& 基本上是双操作数条件运算符:k => !isNaN(obj[k]) && obj[k] % 2 === 0 && delete obj[k] 不,我不提倡那。 :-)
  • @T.J.Crowder 这也可以正常工作,但不那么可读;但如果你缩小它,它可能最终看起来接近这个:P
  • @Joe - 因此我不提倡它。 :-)
【解决方案3】:

您可以使用logical AND && 并删除一些多余的括号。

function removeEvenValues(obj) {
    Object.keys(obj).forEach(k => !isNaN(obj[k]) && obj[k] % 2 === 0 && delete obj[k]);
}

var o = { foo: 41, bar: 42 };
removeEvenValues(o);

console.log(o);

【讨论】:

    【解决方案4】:

    正如 Nina 所写,您可以使用逻辑运算符而不是三元运算符。你也可以反过来使用||

    注意isNaN 返回的内容。例如isNaN([2]) === false!因此,您可能希望使用 typeof 测试原始数字类型。

    最后,最近Object.entries 方法在一些浏览器中找到了它的方式,在这种情况下,它可以很好地代替Object.keys

    function removeEvenValues(o) {
        Object.entries(o).forEach(([k, v]) => typeof v != "number" || v % 2 || delete o[k]);
    }
    
    // Sample
    var obj = {
        "a": 2,
        "b": "hello",
        "c": [4],
        "d": 5,
        "e": 6
    };
    
    removeEvenValues(obj);
    
    console.log(obj);

    【讨论】:

      猜你喜欢
      • 2018-12-04
      • 2019-11-19
      • 1970-01-01
      • 2018-07-13
      • 2014-04-26
      • 2018-07-05
      • 1970-01-01
      • 2017-11-12
      相关资源
      最近更新 更多