连接查询参数并将它们添加到 url

Concatenate query params and add them to url

我有一个包含 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 循环只影响最后一次迭代的值。

首先:我正在做的是生成查询的好方法吗? 第二:如何修复此代码以获取查询中的所有类别?

谢谢。

你用 let i = 1
循环 这应该是 let i = 0

JavaScript 中的索引是从 0 开始的。

正确的是:

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

看起来您正在像 VB 程序员那样编程。

JavaScript 中的索引处理是 "different" 与 VB 中的索引处理:

var a = [0,1,2];
==> a.length = 3
3是数组实际元素个数

所以要遍历所有内容,它是 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);} 

注意 <=,而不是 <。

这就是为什么您需要在 VB 中执行 -1 的原因:For i As Integer = 0 To ctgLength-1 Step 1.
在基于 C 的语言中不需要 -1,因为它们使用 < 而不是 <=,否则您需要指定 <=,那么它也可以工作——尽管这会增加冗余计算。

这样的东西行不通吗?

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

编辑:正如@Mkdgs提到的,我们也可以使用toString()代替join,因为它默认添加逗号

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

首先,看在上帝的份上,请在专用文件中将任何字符串文字定义为常量。这确保了所有相关人员的可维护性和健全性。

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})`;
 }

你可以简单地做:

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

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

console.log(yourresult);