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);
我有这个小函数,可以删除具有偶数值的对象属性。
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);