Javascript 使用递归迭代而不是FOR循环

Javascript 使用递归迭代而不是FOR循环,javascript,Javascript,我最近开始在Airbnb规则中使用eslint。它对以下使用进行循环的代码非常生气。我不能忽略规则,决定尝试使用递归编写迭代逻辑 原始代码后面的代码是我的解决方案。我想知道这是否正确,或者是否有更好的方法来处理这种情况。以下是我试图修正的规则: 我需要在迭代过程中等待Neo4j查询 原创 for (const row of allArgsInUseReduce) { // eslint-disable-line for (const key in row) { // eslint-disab

我最近开始在Airbnb规则中使用eslint。它对以下使用
进行
循环的代码非常生气。我不能忽略规则,决定尝试使用递归编写迭代逻辑

原始代码后面的代码是我的解决方案。我想知道这是否正确,或者是否有更好的方法来处理这种情况。以下是我试图修正的规则:

我需要在迭代过程中等待Neo4j查询

原创

for (const row of allArgsInUseReduce) { // eslint-disable-line
  for (const key in row) { // eslint-disable-line
    const cypher = allUtilReducers.generateCypher('CYPHER_GET_PROPERTY', key, row[key])
    const neo4jPropInUse = await allNeo4j.tx(allNeo4jTx, 'NO OBJECT', cypher) // eslint-disable-line
    for (const result of neo4jPropInUse) { // eslint-disable-line
      if (neo4jPropInUse.length !== 0) {
        const neo4jProperties = result.get('RESULT').properties
        if (neo4jProperties[thingSerialNumber] !== owner) {
          results = [...results, Object.assign({}, { key })]
        }
      }
    }
  }
}
递归的

let objectCounter = 0
const numObjects = allArgsInUseReduce.length
const eachObject = async function calledForEachObject() {
  const object = allArgsInUseReduce[objectCounter]
  let keyCounter = 0
  const keys = Object.keys(allArgsInUseReduce[objectCounter])
  const numKeys = keys.length
  const eachKey = async function calledForEachKey() {
    const key = keys[keyCounter]
    const value = object[key]
    const cypher = allUtilReducers.generateCypher('CYPHER_GET_PROPERTY', key, value)
    const neo4jPropInUse = await allNeo4j.tx(allNeo4jTx, 'NO OBJECT', cypher)
    neo4jPropInUse.forEach((result) => {
      if (neo4jPropInUse.length !== 0) {
        const neo4jProperties = result.get('RESULT').properties
        if (neo4jProperties[thingSerialNumber] !== owner) {
          results = [...results, key]
        }
      }
    })
    if (numKeys === (keyCounter + 1)) return
    keyCounter += 1
    await eachKey()
  }
  await eachKey()
  if (numObjects === (objectCounter + 1)) return
  objectCounter += 1
  await eachObject()
}
await eachObject()

你误解了几件事。首先,您的新代码没有使用递归;递归是一个函数调用自身的过程。其次,eslint错误并不是建议您使用
async
await
方法,而是建议您使用像这样的本地iterable方法。因此,您不必使用
for(const key in row){
而是使用
row.forEach(function(key){
@Hamms,我不知道你的意思。每个对象调用自己,每个键也调用自己。而且,你不能在forEach循环中等待,这就是我这样做的原因。啊,我知道你现在在做什么。我很抱歉;我被命名两次的方法弄糊涂了。如果你的
allNeo4j.tx
可以并行完成,那么你可能想做什么do是use,您误解了几件事。首先,您的新代码没有使用递归;递归是当函数调用自身时进行的。其次,eslint错误没有建议您使用
async
await
方法,而是建议您使用本机iterable方法,例如。So而不是
(行中的常量键){
您将执行
row.forEach(函数(键){
@Hamms,我不知道你的意思。每个对象调用自己,每个键也调用自己。而且,你不能在forEach循环中等待,这就是我这样做的原因。啊,我知道你现在在做什么。我很抱歉;我被命名两次的方法弄糊涂了。如果你的
allNeo4j.tx
可以并行完成,那么你可能想做什么做的就是使用和