Javascript - 使用简化的单行 if 语句更新变量



小问题,我在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]);

它可以重复使用......但它并没有真正回答你的问题 - 一行代码。三元运算符用于此 - 但是是的,它看起来很丑。

最新更新