连接查询参数并将它们添加到 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);
我有一个包含 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);