Объединить параметры запроса и добавить их в URL - PullRequest
1 голос
/ 08 октября 2019

У меня есть флажок из 4 категорий (Ошибка, Предупреждение, Информация и Отладка), и всякий раз, когда пользователь проверяет некоторые из них, я должен добавить их в запрос, чтобы сделать вызов httpclient.

Например,если пользователь проверит их все, я должен отправить запрос с: (category = eq = Error, category = eq = Warning, category = eq = Info, category = eq = Debug)

Это то, что я сделал,Я пытался создать строковый объект и объединить один за другим, если они проверены:

 if (obj.category) {
      const ctgLength = obj.category.length; //the number of categorieschecked by the user
      object["(category=eq"] = obj.category[0];
      for (let i = 1; i < ctgLength - 1; i++) {
      console.log(obj.category[i]);
      object[",category=eq"] = obj.category[i] + ",";
     }
     object["category=eq"] = obj.category[ctgLength - 1] + ")";
   }

Но я получаю следующее: (category = eq = Error, category = eq = Info, category = eq = Debug) Цикл for влияет только на значение последней итерации.

Во-первых: это то, что я делаю, хороший способ для создания запроса в моем случае? Второе: как я могу исправить этот код, чтобы получить все категории в запросе?

Спасибо.

Ответы [ 4 ]

1 голос
/ 08 октября 2019

Прежде всего, пожалуйста, ради бога, определите любые строковые литералы как константы в отдельном файле. Это гарантирует ремонтопригодность и здравомыслие для всех участников.

const Constants = {
  CategoryQueryParam: "category=eq"
};

Теперь давайте перенесем этот код в свою собственную функцию

function buildCategoryQueryString (selectedCatergories) {}

И немного изменим реализацию.

 function buildCategoryQueryString (selectedCatergories: string[]): string {
     if (selectedCatergories == null || selectedCatergories.length === 0) {
         return null;
     }
     let queryString = selectedCatergories.map(category => 
     `${Constants.CategoryQueryParam}=${category}`).join(',');
     return `(${queryString})`;
 }
1 голос
/ 08 октября 2019

Вы делаете свой цикл с let i = 1это должно быть let i = 0Индексы в JavaScript основаны на 0.

Правильно:

for (let i = 0; i < ctgLength; i++) {

Похоже, что вы программируете, как программист VB.

Обработка индексов в JavaScript "отличается" от VB:

var a = [0,1,2];==> a.length = 33 - фактическое количество элементов в массиве

Таким образом, чтобы перебрать все, это for(var i =0; i < 3; ++i) console.log(a[i]);

В VB вы можете сделать

For i As Integer = 0 To 4 Step 1
    System.Console.WriteLine(i)
Next i

, и эквивалент в языках на основе c будет

for (let i = 0; i <= ctgLength; i++) { console.log(i);} 

обратите внимание на <=, а не на <. </p>

, поэтому вам нужно сделать -1 в VB: For i As Integer = 0 To ctgLength-1 Step 1. Это -1 не требуется в языках на основе C, так как они используют <, а не <=, в противном случае вам нужно указать <=, тогда это тоже работает - хотя это добавляет избыточные вычисления. </p>

0 голосов
/ 08 октября 2019

Вы можете просто сделать:

obj = {};
obj.category = ['woot','foo','bar','42']; // if it's an array 

var yourresult = '('+obj.category.map( str =>  "category=eq="+str )+')';

console.log(yourresult);
0 голосов
/ 08 октября 2019

что-нибудь вроде этой работы не будет?

const combinedCategories = obj.category.map(category => `category=eq=${category}`).join(',');
const combinedCategoriesEnclosedInBrackets = `(${combinedCategories})`

Редактировать: как упомянуто @ Mkdgs , мы также можем использовать toString() вместо объединения, так как оно добавляет запятую по умолчанию

const combinedCategories = obj.category.map(category => `category=eq=${category}`).toString();
...