Javascript 什么';从属性数量未知的对象构建URL的最有效方法是什么?
我正试图编写一组可重用函数来抽象一组SharePoint的RESTAPI web服务,这可能是不必要的上下文,但我总是觉得这些问题有点奇怪 无论如何。端点都接受参数,我决定提供执行AJAX调用的操作,并处理Javascript对象的返回(如果有更好的方法,我仍在学习,完全接受建议),该对象称为“选项”,其属性为参数,如下所示:Javascript 什么';从属性数量未知的对象构建URL的最有效方法是什么?,javascript,function,object,sharepoint-2013,Javascript,Function,Object,Sharepoint 2013,我正试图编写一组可重用函数来抽象一组SharePoint的RESTAPI web服务,这可能是不必要的上下文,但我总是觉得这些问题有点奇怪 无论如何。端点都接受参数,我决定提供执行AJAX调用的操作,并处理Javascript对象的返回(如果有更好的方法,我仍在学习,完全接受建议),该对象称为“选项”,其属性为参数,如下所示: ApiHelper.prototype.getListData = function(options){ //Set the base endpoint Url.
ApiHelper.prototype.getListData = function(options){
//Set the base endpoint Url.
var executeUrl = "/web/lists/getByTitle('"+options.list+"')";
//Determine if the URI will have parameters.
var params;
var paramList = [];
if(options.select.length || options.filter.length || options.expand.length || options.top.length){
params = true;
paramList.push(options.select,options.filter,options.expand,options.top);
}else{
params = false;
}
//The first two ops are super basic and don't take parameters, so I collapse them into a single line.
if(options.op == 'All'){return this.execute(executeUrl).then(function(data){if(data.d){return data.d;}else{throw "Something bad happened..."}});
}else if(options.op == 'Id'){executeUrl+='/Id';return this.execute(executeUrl).then(function(data){if(data.d){return data.d.Id;}else{throw "Something bad happened..."}});
}else if(options.op == 'Forms' || options.op == 'Views' || options.op == 'WorkflowAssociations'){
executeUrl+=options.op;
return this.execute(executeUrl).then(function(data){
if(data.d && data.d.results){
return new QueryResults(data.d.results);
} else {
throw "Something bad happened...";
}
});
}else{
if(params){
//No idea...
}else{
//If we're doing Items but without params...
executeUrl+='/items';
}
return this.execute(executeUrl).then(function(data){
if(data.d && data.d.results){
return new QueryResults(data.d.results);
} else {
throw "Something bad happened...";
}
});
}
为了便于用户使用,我想将参数设置为可选的。最初,我使用参数执行类似的操作:
if(typeof options.select === 'undefined'){options.select = '';}
if(typeof options.filter === 'undefined'){options.filter = '';}
if(typeof options.expand === 'undefined'){options.expand = '';}
if(typeof options.top === 'undefined'){options.top = '10000';}
然后构造带有附加参数的URL,只是空的。那个工作,但它似乎不雅观和SharePoint,你知道,我永远不能肯定它会工作。因此,我的目标是查看options对象,例如,如果有一个select语句,则追加$select=[which],如果没有,则不追加。过滤器、展开和顶部也一样
function getProps(obj){
var str='';
for(var prop in obj){
if(str)str+='&';
else str='?';
str+=prop+'='+obj[prop];
}
return str;
}
我希望这会有所帮助。不要忘记URL查询的所有部分
function param(obj) {
return Object.keys(obj).map(key => {
return [key, obj[key]].map(encodeURIComponent).join('=');
}).join('&');
}
您还可以查看jQuery的。它的功能基本相同,并且支持数组。您可以找到源代码。所以,两个答案都很好,但我最终使用了$.param,这就是诀窍。谢谢