小问题,我在JS中有一个var,只要当前值低于99,我就想增加它,否则它应该重置为零。
当前简化代码
var age = 35;
age = ( age < 99) ? age+1 : 0;
现在,这是人类可读的。但是,如果我的变量是obj[layer01][gridY][gridX][shape]
呢 这会将我的行更改为:
obj[layer01][gridY][gridX][shape] = ( obj[layer01][gridY][gridX][shape] < 99) ? obj[layer01][gridY][gridX][shape]+1 : 0;
问题
有没有办法简单地解决这个问题?像这样:
age = (< 99) ? ++ : 0;
最简单的方法是创建一个函数:
var obj = {
a: {
b: 1
}
};
function increment(value, max) {
// this do the same as your ternary operator
return (value + 1) % max;
}
obj['a']['b'] = increment(obj['a']['b'], 100);
console.log(obj['a']['b']);
// THIS DOES NOT WORK (won't update obj):
var x = obj['a']['b'];
x = increment(x, 100);
console.log(obj['a']['b'], x);
将变量存储在变量temp
然后执行以下操作:
试试这个:
let age = obj[layer01][gridY][gridX][shape];
obj[layer01][gridY][gridX][shape] = ( age < 99) ? (age + 1) : 0;
像这样使用模( % )
运算符 -
var age = 95;
var limit = 100;
function incrementValue()
{
age = (age+1) % limit;
document.getElementById('number').value = age;
}
document.getElementById('number').value = age;
<form>
<input type="number" id="number"/>
<input type="button" onclick="incrementValue()" value="Increment Value" />
</form>
如果您希望将其作为一行,我认为您的解决方案可能是解决它的最佳方法。或者,您可以使用临时变量,或者使用较短的变量。
将obj[layer01][gridY][gridX][shape]
设置为变量并在三元运算符中使用它
var x=obj[layer01][gridY][gridX][shape]
x= ( x< 99) ? x+1 : 0;
obj[layer01][gridY][gridX][shape]=x;
您可以获得的最小值是:
let y = obj[layer01][gridY][gridX], x = y[shape];
y[shape] = (x < 99) ? x + 1 : 0;
或完全不可读
(x => x[shape] = x[shape] < 99 ? x[shape] + 1 : 0)(obj[layer01][gridY][gridX])
甚至
((x, a) => x[a] = x[a] < 99 ? x[a] + 1 : 0)(obj[layer01][gridY][gridX], shape)
正如我在对其他一些答案的评论中指出的那样,您不能只接受引用obj[layer01][gridY][gridX][shape]
的变量,因为分配给该变量不会对obj[layer01][gridY][gridX][shape]
产生任何影响。您需要至少保留叶子上方的级别,以便能够分配给叶子。
无论如何,除非您正在打高尔夫球,否则您不应该害怕添加额外的线。可读性优于简洁性。正如另一个答案所指出的,我更愿意使用取模运算符使逻辑明确:
obj[layer01][gridY][gridX][shape] = (obj[layer01][gridY][gridX][shape] + 1) % 100;
首先,我认为这是一个绝妙的主意,我找到了以下解决方案:
obj[layer01][gridY][gridX][shape] = function(x) { var i = parseInt(x); return i < 99 ? ++i : 0; }(obj[layer01][gridY][gridX][shape]);
这里最重要的事情是parseInt调用 - 内联函数使它更简单一些,但我会创建一个单独的函数并像这样调用它:
var myfn = function(x) { var i = parseInt(x); return i < 99 ? ++i : 0; };
obj[layer01][gridY][gridX][shape] = myfn(obj[layer01][gridY][gridX][shape]);
它可以重复使用......但它并没有真正回答你的问题 - 一行代码。三元运算符用于此 - 但是是的,它看起来很丑。