我有一个将对象附加到url的方法。我正在使用Ionic和Java作为后端。下面是方法。
public buildUrl(urlDetails:Object, vals:Object):string {
let baseUrl = urlDetails["url"];
console.log(baseUrl)
console.log(vals)
//replace $(..) with the values from vals
let keys = vals ? Object.keys(vals) : null
if(keys && keys.length > 0) {
return baseUrl.replace(/:(\w+)/g, (_,k) => vals[k]);
} else {
return baseUrl;
}
例如,传递给对象的示例参数如下所示,
urlDetails:http://192.168.0.109:8080/hiya/user/login
vals:{emailid:'test @ test.com,password:'password'}
这里 baseUrl.replace(/:(\ w +)/ g,(_,k)=> vals [k])函数从baseurl中删除“:8080”,结果baseurl将如下图所示
http://192.168.0.109undefined/hiya/user/login
我猜想 baseUrl.replace(/:(\ w +)/ g,(_,k)=> vals [k])
谢谢!
答案 0 :(得分:2)
您的replace
用:
上的所有内容替换"8080"
之后的所有内容(在本例中为k
,您的回调以vals
的形式收到)用该字符串("8080"
命名的属性的对象。您的vals
对象没有名称为"8080"
的任何属性,因此vals[k]
是undefined
。
我想说要怎么做,但是不清楚“将对象附加到URL”的意思以及为什么要指定要替换的端口。
例如,如果您尝试将对象的属性作为查询字符串参数应用于URL,则不会在端口上使用replace
。由于您似乎是针对现代环境,因此我可能会遍历Object.entries
的结果(如有必要,可以很容易地对其进行填充)并追加到字符串中,以确保使用{{3} }:
function buildUrl(urlDetails, vals) {
let baseUrl = urlDetails["url"];
let sep = "?";
for (const [key, value] of Object.entries(vals)) {
baseUrl += `${sep}${encodeURIComponent(key)}=${encodeURIComponent(value)}`;
sep = "&";
}
return baseUrl;
}
console.log(
buildUrl(
{url: "http://192.168.0.109:8080/hiya/user/login"},
{emailid:'test@test.com',password:'password'}
)
);
function buildUrl(urlDetails, vals) {
let baseUrl = urlDetails.url;
const entries = Object.entries(vals);
if (entries.length) {
baseUrl += "?" + entries.map(([key, value]) =>
`${encodeURIComponent(key)}=${encodeURIComponent(value)}`
).join("&");
}
return baseUrl;
}
console.log(
buildUrl(
{url: "http://192.168.0.109:8080/hiya/user/login"},
{emailid:'test@test.com',password:'password'}
)
);