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],
是的,这可能是另一个实现。我更喜欢你的