Логический оператор терпит неудачу после вычисления - PullRequest
0 голосов
/ 24 апреля 2020

var sub_response_type = {"survey_question":["Test lable"],"responseTypeText":"Exit label","select_param_type":[">","<"],"questions_id":["7","8"],"select_param_value":["12","34"],"radio_type":["&&"]};

    var order = ['questions_id', 'select_param_type', 'select_param_value', 'radio_type'];
    var result = [];
    var i = 0;
    
    do result.push(...order.map(k => sub_response_type[k][i]));
    while (sub_response_type.radio_type[i++])

    result = result.join(' ');
    console.log("results: ", result);
    
    if (result) {
        console.log("True");
    }else{
        console.log("False");
    }

Я хотел бы использовать вышеприведенный result в формате 7 > 12 && 8 < 34, чтобы выполнить его в операторе if для сравнения.

В этом случае он должен вывести false как 7 > 12 && 8 < 34, это выполняется в false с использованием логических операторов.

По какой-то причине он выдает true.

Чего мне не хватает, кому-нибудь?

1 Ответ

0 голосов
/ 24 апреля 2020

У вас есть буквальная строка ' 7 > 12 && 8 < 34 ', а непустые строки являются правдивыми, поэтому вы получите true.

Если вы хотите оценить его как выражение Javascript, сначала удалите все символы, которые могут привести к выполнению произвольного кода с помощью белого списка, скажем, чисел и операторов, которые вы хотите разрешить, удалите все другие символы, а затем eval it:

var sub_response_type = {
  "survey_question": ["Test lable"],
  "responseTypeText": "Exit label",
  "select_param_type": [">", "<"],
  "questions_id": ["7", "8"],
  "select_param_value": ["12", "34"],
  "radio_type": ["&&"]
};

var order = ['questions_id', 'select_param_type', 'select_param_value', 'radio_type'];
var result = [];
var i = 0;

do result.push(...order.map(k => sub_response_type[k][i]));
while (sub_response_type.radio_type[i++]);

const origStr = result.join(' ');
const safeStr = origStr.replace(/[^\d&>< ]+/g, '');
console.log(safeStr);
console.log(eval(safeStr));

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

...