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

Javascript 连接查询参数并将其添加到url,javascript,angular,string,typescript,angular-httpclient,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 =

我有一个包含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] + ")";
   }
if(对象类别){
const ctgLength=obj.category.length;//用户检查的类别数
对象[“(类别=等式”]=对象类别[0];
for(设i=1;i
但我得到的是:(category=eq=Error,category=eq=Info,category=eq=Debug) for循环只影响最后一次迭代的值

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


谢谢。

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


JavaScript中的索引是基于0的

正确答案是:

for (let i = 0; i < ctgLength; i++) {
在基于c的语言中,等价物是

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

for(让i=0;i这样的东西行吗

const combinedCategories = obj.category.map(category => `category=eq=${category}`).join(',');
const combinedCategoriesEnclosedInBrackets = `(${combinedCategories})`
编辑:如前所述,我们也可以使用
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);

@博哈:那是因为你也做ctgLength-1你说的“看起来你的编程就像你会用VB编程”是什么意思。如果你有更好的方法来解决我的问题,请告诉我;)是的,因为我需要在第一个之前和最后一个之后放一个parentese,这就是为什么我在for循环之外处理它们。“var a=[0,1,2];=>a.length=3 3是数组中的实际元素数,因此要循环所有元素,它是用于(var i=0;i<3;++i)console.log(a[i]);“我知道!但这与我的错误仍然没有任何关系:)好吧,你写了你想要得到(category=eq=error,category=eq=Warning,category=eq=Info,categegory=eq=Debug)但你实际上得到了(category=eq=Error,category=eq=Info,category=eq=Debug)缺少警告,这可能是因为警告是最后一个元素,您在缺少最后一个元素的地方跳过了循环。而map join起作用的原因是因为它为您执行循环,并删除了您的“能力”“做错事。我不理解你为什么要在ctgLength中存储类别号。你不知道什么是真正的checkedNo,我知道!因为它是用另一个函数处理的,所以我在类别数组中只有选中的,在我的代码中,包含所有类别的预声明数组称为categories:)你可以在线执行此操作,看到我的答案非常感谢你做了两件事,第一:你的解决方案解决了我的问题,第二,你让我学会了一种更好的方法,不用对我的编码级别进行预先判断:)所以,谢谢你,所以实际上不需要太多的连接(“,”),因为字符串默认情况下添加逗号:正如你所说,我为查询常量创建了一个文件。我感谢您帮助我使我的代码更清晰易懂。
obj = {};
obj.category = ['woot','foo','bar','42']; // if it's an array 

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

console.log(yourresult);