Можно ли упростить эту положительную/отрицательную проверку?

Я в основном хочу проверить, прошло ли newValue мимо targetValue. Но targetValue может быть либо положительным, либо отрицательным числом, поэтому если ( newValue < targetValue ) не обязательно будет работать.

Я закодировал это ниже, и я могу переусердствовать здесь, но я подумал, есть ли способ переписать if-check немного более элегантно...

var newValue = 0;

function ChangeValue ( targetValue : int )
{
 var isTargetPositive = ( targetValue > 0 );

 if ( isTargetPositive && newValue < targetValue || !isTargetPositive && newValue > targetValue )
 newValue = math.moveTowards( newValue, targetValue, 1 );
 else
 // Do something else
}
5 ответов

Единственное, что я могу думать об этом, - это то, что ваши условия точно так же, как и они, - это удаление переменной isTargetPositive и замена вашего оператора if следующим:

if ( targetValue > 0 ? newValue < targetValue : newValue > targetValue )


это почти тот же случай, что и в моем шахматном проекте, где я изменился:

if((obj.ActiveColor&¤t_val>0) || (!obj.ActiveColor&¤t_val<0)){}

с

var impossible_to_name = (current_val * (obj.ActiveColor?1:-1));

if(impossible_to_name>0){}

Я знаю, что вам не нужно кэшировать var, но в моем случае я собирался использовать его позже, поэтому я его кэшировал, мой код настолько сложный, что я даже не мог назвать свое имя для своего var, я также не совсем уверен, поможет ли это вам, если я не смог бы перевести его в ваш код, скорее всего, вы не можете ни того, ни другого, но я снова попытаюсь понять свой код и внести изменения в свой ответ.

Примечание: мой код был завернут if(current_val){...} поэтому значение - это что угодно, кроме 0


Вы всегда можете сделать подфункцию, если это недостаточно ясно

function abs_compare(target, number) {
 return target != 0 && ((target > 0 && target > number) || target < number);
}

if (abs_higher(targetValue, newValue)) {
 newValue = math.moveTowards(newValue, targetValue, 1);
}

Я также предпочел бы target != 0 вместо двойной проверки, если он превосходит или уступает 0, потому что в вашем заявлении условия более ясны, что это запретное значение.

Кроме того, Pointy сказал, что, поскольку вы инициализировали newValue равным 0, он всегда останется 0, который в настоящее время является ложным, поскольку функция ChangeValue является функцией. Новый ключ может быть изменен перед вызовом функции.

ОБНОВИТЬ

Возможно, я читал слишком быстро. Сравнение цели с 0 не будет поддерживать вашу фактическую логику, и это то же самое, что и двойная проверка. Во всяком случае, вы все равно можете использовать функцию.

Также лучшим ответом будет использование условия target > 0? target > number: target < number target > 0? target > number: target < number


var newValue = 0;
 function ChangeValue ( targetValue )
 {
 if ( 
 ((targetValue > 0) && (newValue < targetValue)) 
 || 
 ((targetValue < 0) && (newValue > targetValue ))
 )
 {
 newValue = math.moveTowards( newValue, targetValue, 1 );
 } 
 else{
 // Do something else
 }
 }


Тест (ввод: 5) isTargetPositive - соответствие newValue

Тест (вход: -1)! IsTargetPositive - соответствие newValue> targetValue - соответствие

+ve или -ve целое число, оно будет соответствовать IF.

isTargetPositive && newValue

licensed under cc by-sa 3.0 with attribution.