Javascript速记或操作
我觉得这一定是一个副本,但我一直找不到任何东西,可能是因为不同的措辞,或者只是因为真的没有更好的 我正在生成一大块JS代码,其中“ORs”对象属性带有变量,而标识符不一定匹配。看起来是这样的(值是布尔值): 为了让它更瘦,我试了一些Javascript速记或操作,javascript,Javascript,我觉得这一定是一个副本,但我一直找不到任何东西,可能是因为不同的措辞,或者只是因为真的没有更好的 我正在生成一大块JS代码,其中“ORs”对象属性带有变量,而标识符不一定匹配。看起来是这样的(值是布尔值): 为了让它更瘦,我试了一些 a.st1 |= st; 但是它使a.st1成为整数而不是布尔值,我不想再添加一行带双反的内容来将其重新键入布尔值 使用直觉,我还尝试了| |=,但没有帮助:) 有没有更好(更短)的方法来编写这些命令 注意:我不能使用循环来处理命令,因为命令不是一次执行完的,而是
a.st1 |= st;
但是它使a.st1
成为整数而不是布尔值,我不想再添加一行带双反的内容来将其重新键入布尔值
使用直觉,我还尝试了| |=
,但没有帮助:)
有没有更好(更短)的方法来编写这些命令
注意:我不能使用循环来处理命令,因为命令不是一次执行完的,而是在代码的其余部分分散成小块(为了简单起见省略了这些块)。不,javascript中没有速记或运算符。但是,它确实提供了
|124;=
和?=
支持
有没有更好(更短)的方法来编写这些命令
在您的例子中,您正在修改a
对象,而不是指定给变量。您可以以循环方式执行此操作:
function amendWith(target, source)
for (var p in source)
if (!target[p])
target[p] = source[p];
return target;
}
不,javascript中没有速记或运算符。但是,它确实提供了
|124;=
和?=
支持
有没有更好(更短)的方法来编写这些命令
在您的例子中,您正在修改a
对象,而不是指定给变量。您可以以循环方式执行此操作:
function amendWith(target, source)
for (var p in source)
if (!target[p])
target[p] = source[p];
return target;
}
我不确定这是否更短,但作为一种替代方法,您可以将OR逻辑放入函数中,然后循环遍历您的值
function myFunctionName(value1, value2) {
return value1 || value2;
}
//names are property names of object 'a' that you want to set, values are the alternate (default) values
var myMapping = {borderline:borderline, st1:st, reallyLongName123:reallyLongName};
for (temp in myMapping) {
a.temp = myFunctionName(a[temp], myMapping[temp]);
}
由于您无法使用循环,并且无法提前知道所有值,因此可以尝试将函数添加到对象“a”中
a.test = function(propName, otherValue) {
this[propName] = this[propName] || otherValue;
};
a.test("borderline", borderline);
我不确定这是否更短,但作为一种替代方法,您可以将OR逻辑放入函数中,然后循环遍历您的值
function myFunctionName(value1, value2) {
return value1 || value2;
}
//names are property names of object 'a' that you want to set, values are the alternate (default) values
var myMapping = {borderline:borderline, st1:st, reallyLongName123:reallyLongName};
for (temp in myMapping) {
a.temp = myFunctionName(a[temp], myMapping[temp]);
}
由于您无法使用循环,并且无法提前知道所有值,因此可以尝试将函数添加到对象“a”中
a.test = function(propName, otherValue) {
this[propName] = this[propName] || otherValue;
};
a.test("borderline", borderline);
在Javascript中,不,据我所知不是这样。你可能想研究一下coffeescript,它有一个
?=
。1
和0
不受欢迎的具体原因是什么?@PatrickQ稍后我会将它制作成JSON并发送到某个地方。为了遵守协议,我必须区分0
和false
。然而,我不能将所有的零转换为false
,因为还有有效的数值。你可能想研究一下coffeescript,它有一个?=
。1
和0
不受欢迎的具体原因是什么?@PatrickQ稍后我会将它制作成JSON并发送到某个地方。为了遵守协议,我必须区分0
和false
。但我无法将所有零转换为false
,因为还有有效的数值。不会更短,因为您仍在重复a.borderline
两次。确切地说,主要问题是重复a.borderline
部分,有时可能会很长。@Erlik我更新了代码以使用循环,这会让它更干净吗?@monkybonk05是的,现在不再重复了。但是,我不能使用循环,也不能使用静态初始化var myMapping={…
。我以分散的方式获取值并使用它们(请参阅后面添加到问题中的注释)@Erlik你能为对象“a”添加函数吗?如果能,请查看我的更新。不能缩短,因为你仍在重复a.borderline
两次。确切地说,主要问题是重复a.borderline
部分,有时可能会很长。@Erlik我更新了代码以使用循环,这会使它更干净吗?@monkybonk05es,现在它不再重复了。但是,我不能使用循环,也不能使用静态初始化var myMapping={…
。我以分散的方式获取值并使用它们(请参阅后面添加到我的问题中的注释)。@Erlik你能为对象“a”添加函数吗?如果能,请查看我的更新。不幸的是,我不能使用循环(在您可能已经阅读了问题后添加了注释),但我肯定会调查Coffeescript选项。谢谢!是的,我没有注意到编辑。不过,您可能会发布完整代码(在[cr.SE]的新问题中,在一些在线粘贴服务中,或在您的问题中)这样我们就可以看看是否有更好的模式了。好吧,酷!咖啡脚本对我有用。幸运的是,它可以在通过瓶颈后被编译成“长”代码,所以CS节省了时间。有趣的是,a.st1 | |=st
被编译成a.st1 | |(a.st1=st)
,我花了一段时间才理解,但很好..它起作用:)不幸的是,我不能使用循环(在您可能已经阅读了问题后添加了注释),但我肯定会调查Coffeescript选项。谢谢!是的,我没有注意到编辑。不过,您可以发布完整的代码(或者在[cr.SE]的新问题中发布),在一些在线粘贴服务中,或在您的问题中),这样我们就可以看到是否有更好的模式。好的,酷!咖啡脚本对我来说很有用。幸运的是,它可以在通过瓶颈后被编译成“长”代码,所以CS可以节省时间。顺便说一句,有趣的是,a.st1 |=st
被编译成a.st1 | |(a.st1=st)
,我花了一段时间才理解,但很好..它有效:)