forEach 中箭头函数内的三元运算符

ternary operator inside an arrow function inside forEach

我有这个小函数,可以删除具有偶数值的对象属性。

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

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

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

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

是的,你不应该在这里使用简洁的箭头函数或三元运算符。好吧,你 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];
}

您可以使用 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);

正如 Nina 所写,您可以使用逻辑运算符代替三元运算符。您也可以改变条件并使用 ||.

请注意 isNaN returns。比如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);