Не уверен, как лучше это сформулировать (и, следовательно, не смог найти предыдущие ответы, хотя я ожидаю, что на него уже отвечали ранее), но меня интересует, есть ли способ превратить код в такой код:

if ( this.props.mailboxFilter == 'sent' ) {
  return this.currentUser.canActOnBehalfOf( m.senderID );
} else {
  return !this.currentUser.canActOnBehalfOf( m.senderID );
}

На что-то вроде ниже (не уверен, как лучше выразить это):

var bangOrNot = this.props.mailboxFilter == 'sent ? '!' : '';
bangOrNot( this.currentUser.canActOnBehalfOf( m.senderID ) );

Например, есть ли способ избежать расширенного синтаксиса if / else и всех повторений, выбрав, вызывать ли строку return с ударом?

7
Sasha 16 Дек 2015 в 01:10

5 ответов

Лучший ответ

Вы можете упростить это другими способами:

var response = this.currentUser.canActOnBehalfOf(m.senderID);
return this.props.mailboxFilter == 'sent' ? response : !response;

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

9
Xophmeister 15 Дек 2015 в 22:14

Предполагая, что вы используете javascript, вы можете использовать метод eval для оценки строки кода javascript. Вы можете условно применить удар к началу строки и затем вернуть результат eval.

-4
William Rosenbloom 15 Дек 2015 в 22:14

Есть много хороших комментариев относительно того, почему или почему НЕ делать такую вещь. Я предполагаю, что у ОП есть веская причина хотеть применить удар (!) Перед результатом вызова функции. Мой ответ - скорее техническое решение вопроса ОП.

function bang(r) {
    return !r;
}
function notBang(r) {
    return r;
}
function canActOnBehalf() {
    return true;
}
var filter = 'notsent';
var f = (filter == 'sent' ? bang : notBang);
f(canActOnBehalf('whatever'));
0
Will 15 Дек 2015 в 23:13

Здесь вы хотите использовать логический оператор XNOR - также известный как эквивалентность :

return this.currentUser.canActOnBehalfOf(m.senderID) == (this.props.mailboxFilter == 'sent');
3
Bergi 15 Дек 2015 в 22:56

Если {{X 0}} всегда возвращает логическое значение, вы можете сделать XOR.

return (this.props.mailboxFilter != 'sent') ^ this.currentUser.canActOnBehalfOf(m.senderID);

XOR логическое значение с true делает NOT. И XOR с false создает буфер, который поддерживает то же значение.

Обратите внимание, что я изменил == на !=.

И просто убедитесь, что вы добавили комментарии к этой части кода, если собираетесь использовать ее на самом деле. Не так просто прочитать этот код через некоторое время.

Обновить

Как и Берги, лучше использовать Boolean XOR != для возврата логического значения.

return (this.props.mailboxFilter != 'sent') != this.currentUser.canActOnBehalfOf(m.senderID);

И, конечно, если он также может использоваться с логическим XNOR, просто замените оба != на == в приведенном выше коде.

5
Community 23 Май 2017 в 11:44