Javascript 生成递归函数

Javascript 生成递归函数,javascript,recursion,Javascript,Recursion,过滤器有嵌套结构 { where: [{ relation: 'user', query: { where: [{ relation: 'companies', query: { ... } }] } }] } 我想使用递归函数来生成返回匿名函数的查

过滤器有嵌套结构

{
    where: [{
        relation: 'user',
        query: {
            where: [{
                relation: 'companies',
                query: {
                    ...
                }
            }]
        }
    }]
}
我想使用递归函数来生成返回匿名函数的查询类型,匿名函数将参数传递给最终查询

例如,对于“user.companys”之类的筛选查询,它应该返回:

function (fieldQuery) {
    return {
        where: [{
            relation: 'user',
            query: {
                where: [{
                    relation: 'companies',
                    query: fieldQuery
                }]
            }
        }]
    }
}
实现该功能的更好方法是什么?

这似乎可行

// Usage:
fq = 'Some FieldQuery';
filter = 'users.companies.jobs';
result = fieldQuery(fq, filter);

// Recursive function.
// Call with 2 arguments, leave the 3rd one undefined.
function fieldQuery(fq, filter, result=undefined) {
  // Index of the last period in filter.
  var lastIndex = filter.lastIndexOf('.');
  // Starting index of the last relation in filter.
  var startsAt = lastIndex + 1

  // If the filter is empty (or illegal) we just return the most recent result.
  if (lastIndex <= 0 && startsAt >= filter.length) {
    return result;
  }

  // This would be the last relation.
  var relation = filter.substr(startsAt);
  // The rest of the filter, without the last relation.
  var restOfFilter = filter.substr(0, lastIndex);

  // Recursive function
  return fieldQuery(fq, restOfFilter, {
    'where': [{
      'relation': relation,
      // If result has not been defined before, query is fq.
      // Else, query is the previous result.
      'query': (typeof(result) === 'undefined') ? fq : result
    }]
  });
}
//用法:
fq='一些字段查询';
过滤器='users.companys.jobs';
结果=字段查询(fq,过滤器);
//递归函数。
//使用2个参数调用,保留未定义的第3个参数。
函数字段查询(fq、筛选器、结果=未定义){
//筛选器中最后一个期间的索引。
var lastIndex=filter.lastIndexOf('.');
//筛选器中最后一个关系的起始索引。
var startsAt=lastIndex+1
//如果过滤器为空(或非法),我们只返回最新的结果。
if(lastIndex=filter.length){
返回结果;
}
//这将是最后一位亲戚。
var关系=filter.substr(startsAt);
//过滤器的其余部分,没有最后一个关系。
var restOfFilter=filter.substr(0,lastIndex);
//递归函数
返回字段查询(fq、restOfFilter、{
“哪里”:[{
“关系”:关系,
//若之前未定义结果,则查询为fq。
//否则,查询是上一个结果。
“查询”:(typeof(result)==“undefined”)?fq:result
}]
});
}

好的,我知道了如何实现该功能

let queryString = 'user.companies'
let depthArray = queryString.split('.')

function createDepth (depthArray) {

    return fieldQuery => ({
        where: [
            {
                relation: depthArray[0],
                query: depthArray.length <= 1
                    ? fieldQuery
                    : createDepth(depthArray.slice(1))(fieldQuery)
            }
        ]
    })
}
let queryString='user.companys'
设depthArray=queryString.split('.'))
函数createDepth(深度){
返回字段查询=>({
其中:[
{
关系:depthArray[0],

是的,这可能是另一个实现。我更喜欢你的