Не уверен, как лучше это сформулировать (и, следовательно, не смог найти предыдущие ответы, хотя я ожидаю, что на него уже отвечали ранее), но меня интересует, есть ли способ превратить код в такой код:
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
с ударом?
5 ответов
Вы можете упростить это другими способами:
var response = this.currentUser.canActOnBehalfOf(m.senderID);
return this.props.mailboxFilter == 'sent' ? response : !response;
В общем, вы хотели бы избежать этого метода, если ваша функция изменяет любое состояние. Однако, поскольку в этом случае вы вызываете его независимо, нет ничего плохого в том, чтобы сначала кэшировать его значение.
Предполагая, что вы используете javascript, вы можете использовать метод eval
для оценки строки кода javascript. Вы можете условно применить удар к началу строки и затем вернуть результат eval
.
Есть много хороших комментариев относительно того, почему или почему НЕ делать такую вещь. Я предполагаю, что у ОП есть веская причина хотеть применить удар (!) Перед результатом вызова функции. Мой ответ - скорее техническое решение вопроса ОП.
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'));
Здесь вы хотите использовать логический оператор XNOR - также известный как эквивалентность :
return this.currentUser.canActOnBehalfOf(m.senderID) == (this.props.mailboxFilter == 'sent');
Если {{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, просто замените оба !=
на ==
в приведенном выше коде.
Похожие вопросы
Связанные вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.