Javascript 使用循环创建对象链接

Javascript 使用循环创建对象链接,javascript,knex.js,Javascript,Knex.js,有没有办法从循环创建链接对象? 例如输入: ["table1","table2","table3"] 输出: db .select(fields) .from(table) .innerJoin("table1") .innerJoin("table2") .innerJoin("table3") db .select(fields) .from(table) .innerJoin("table1") .innerJoin("table2")

有没有办法从循环创建链接对象? 例如输入:

["table1","table2","table3"]
输出:

  db
  .select(fields)
  .from(table)
  .innerJoin("table1")
  .innerJoin("table2")
  .innerJoin("table3")
  db
  .select(fields)
  .from(table)
  .innerJoin("table1")
  .innerJoin("table2")
  .innerJoin("table3")
  .innerJoin("table4")
  .innerJoin("table5")
另一项输入:

 ["table1","table2","table3","table4","table5"]
输出:

  db
  .select(fields)
  .from(table)
  .innerJoin("table1")
  .innerJoin("table2")
  .innerJoin("table3")
  db
  .select(fields)
  .from(table)
  .innerJoin("table1")
  .innerJoin("table2")
  .innerJoin("table3")
  .innerJoin("table4")
  .innerJoin("table5")
现在我不知道怎么做,除了使用eval,这不是我想做的事情


我需要它来使用knex连接多个表,因此如果有其他方法可以这样做,我将非常高兴:

我认为研究函数式编程将对您有所帮助

我使用了下面internet链接中的管道函数,但您可以使用lodash/Ramda/下划线或任何您最喜欢的util库

我在这里使用的两个主要概念是咖喱和管道

curry是指将包含多个参数的函数分解为包含部分参数的一系列函数 我们还利用curring,它从另一个函数返回一个函数来组合新函数

管道函数采用n个操作序列;其中每个操作都有一个参数;处理它;并将处理后的输出作为序列中下一个操作的输入。管道函数的结果是一个函数,它是操作序列的捆绑版本

我们在这里做的是获取一个数组,创建一个新的函数数组,我们想应用到一个值

所以我们想在db上做一个连接负载

join=>con=>con.innerJoinjoin

正在获取一个值,即table1,并返回一个函数,该函数接受一个db连接,该连接调用连接并返回下一个连接

const joins=toJoin.mapjoin=>con=>con.innerJoinjoin; 这将创建一个传递给管道的函数数组

常数db={ 选择:功能字段{ console.log'select',字段 返回数据库 }, from:函数表{ console.log'from',表 返回分贝; }, innerJoin:函数连接{ console.log'innerJoin',join 返回分贝; } }; const_pipe=a,b=>arg=>baarg; const pipe=args=>[].slice.applyargs.reduce\u pipe; 函数joinInnerMultipletable,字段,toJoin{ const joins=toJoin.mapjoin=>con=>con.innerJoinjoin; 返回pipejoinsdb.selectfields.fromtable; }
JoinnerMultipleUser、uuid、[table1、table2、table3、table4、table5]链接的工作方式是,这些方法中的每一个都返回一个对象,该对象将下一个方法作为属性。这意味着您可以使用类似这样的方法对从上一个方法返回的对象继续调用下一个方法

reduce接受一个初始对象,您可以传递该对象以使事情顺利进行。比如:

var tables = ["table1","table2","table3"]
let res = tables.reduce((res, table) => res.innerJoin(table), db.select(fields).from(table))
为了了解这是如何工作的,我们可以创建一个假db对象,其中包含为链中的下一个方法返回对象的所有方法。innerJoin方法只是将参数添加到value属性:

//使用这些方法伪造db对象 常数db={ 选择{ this.val=[]//初始化val 还这个 }, 弗洛姆{ 还这个 }, innerJoinname{ this.val.pushAdded:+name 还这个 } } 变量表=[表1、表2、表3] //为每个表调用innerjoin //这与链接它们是一样的 设res=tables.reduceres,table=>res.innerJointable,db.select.from //val属性中累计的值
console.logres.vale你想要代码生成,即输出一个这样的字符串,还是仅仅是整体结果?@JoeWarner谢谢你的提问,我忘了澄清我需要的是整体结果,而不是实际的链接对象。如果我误解了happy to change,我想简单的“for”在这种情况下,循环就可以了。你的答案似乎太复杂了。对FP的热情很高,但它可能会给OP带来比值更大的混乱。这更多地是从链接不同网络函数的负载的角度来看的,但在这种情况下是有点过分了。这个解决方案非常有效。knex用户注意:db对象是knex连接对象非常乐意帮助:任何问题都让我知道尼斯解决方案仅应用一种类型的函数时,这比我的解决方案要好得多。我尝试过此解决方案,但不幸的是,它不适用于knex db对象,但是,如果没有knex,这一切都很好。这可能是因为reduce创建了一个新对象?我不知道thoreduce不一定返回一个新对象@JoeWarner——它返回reducer函数返回的对象,在本例中,它是最后一次调用innerJoin。我不确定为什么knex不能使用此选项-它似乎应该与链接相同。很抱歉误导,当我尝试您的解决方案时,我在db object上犯了一个错误。结果表明,您的解决方案也可以正常工作。