Javascript 什么';从属性数量未知的对象构建URL的最有效方法是什么?

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.

我正试图编写一组可重用函数来抽象一组SharePoint的RESTAPI web服务,这可能是不必要的上下文,但我总是觉得这些问题有点奇怪

无论如何。端点都接受参数,我决定提供执行AJAX调用的操作,并处理Javascript对象的返回(如果有更好的方法,我仍在学习,完全接受建议),该对象称为“选项”,其属性为参数,如下所示:

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,这就是诀窍。谢谢