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

时间:2019-10-08 09:03:10

标签: javascript angular string typescript angular-httpclient

我有一个包含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] + ")";
   }

但是我得到的是:(类别= eq =错误,类别= eq =信息,类别= eq =调试) for循环仅影响最后一次迭代的值。

首先:在我的情况下,我正在做一个很好的方法来生成查询的方法吗? 第二:如何修复此代码以获取查询中的所有类别?

谢谢。

4 个答案:

答案 0 :(得分:1)

您可以使用let i = 1进行循环
这应该是let i = 0

JavaScript中的索引基于0。

正确的是:

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

好像您正在像VB程序员一样进行编程。

与VB中的JavaScript相比,JavaScript中的索引处理“与众不同”:

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不是必需的,因为它们使用<而不是<=,否则,您需要指定<=,然后它也可以工作-尽管这会增加冗余计算。

答案 1 :(得分:1)

首先,为了上帝的爱,请在专用文件中将任何字符串文字定义为常量。这样可以确保每个参与人员的可维护性和完整性。

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

答案 2 :(得分:0)

像这样的作品吗?

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();

答案 3 :(得分:0)

您可以简单地做到:

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

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

console.log(yourresult);