我有一个包含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循环仅影响最后一次迭代的值。
首先:在我的情况下,我正在做一个很好的方法来生成查询的方法吗? 第二:如何修复此代码以获取查询中的所有类别?
谢谢。
答案 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);