Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/428.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 两个函数之间的递归调用_Javascript_Function_Recursion_Functional Programming - Fatal编程技术网

Javascript 两个函数之间的递归调用

Javascript 两个函数之间的递归调用,javascript,function,recursion,functional-programming,Javascript,Function,Recursion,Functional Programming,我需要递归检查两个对象,键需要排序,所以我创建了两个函数 buildObj-从对象中获取所有uniq键,对它们进行排序,并在每个键上调用buildObjKey buildObjKey-如果其中一个值是object,则为这些值调用buildObj。其他返回是示例,实际代码更复杂 所以问题是:我在buildObjKey之前定义buildObj,并在buildObjKey尚未定义时调用buildObjKey。这是一种糟糕的做法,但如果我在buildObjKey之后移动buildObj的定义,我将在它被

我需要递归检查两个对象,键需要排序,所以我创建了两个函数

buildObj-从对象中获取所有uniq键,对它们进行排序,并在每个键上调用buildObjKey

buildObjKey-如果其中一个值是object,则为这些值调用buildObj。其他返回是示例,实际代码更复杂

所以问题是:我在buildObjKey之前定义buildObj,并在buildObjKey尚未定义时调用buildObjKey。这是一种糟糕的做法,但如果我在buildObjKey之后移动buildObj的定义,我将在它被定义之前调用buildObj。。。这可以在两个函数之间进行递归调用,而不会出现这种问题吗

const _ = require('lodash')

const example1 = {
  key3: 'foo',
  key1: {
    key4: {
      key6: 'boo'
    },
  },
}

const example2 = {
  key3: 'too',
  key1: {
    key4: {
      key6: 'hoo'
    },
  },
}

const buildObj = (obj1, obj2) => {
 return  _.uniq([...Object.keys(obj1), ...Object.keys(obj2)])
 .sort()
 .map(key => buildObjKey(key, obj1, obj2))
}

const buildObjKey = (key, obj1, obj2) => {
  const val1 = obj1[key];
  const val2 = obj2[key];
  if(val1 && val2){
    if(_.isObject(val1) && _.isObject(val2)){
      return buildObj(val1, val2)
    }
    if(_.isObject(val1)){
      return buildObj(val1, val1)
    }
    if(_.isObject(val2)){
      return buildObj(val2, val2)
    }
    return val1
  }
  return val1 || val2
}

buildObj(example1, example2)

执行示例 [['boo']],'foo']


真正的代码是对两个对象进行diff,由于复杂性,我不在这里编写它。这里有一个简单的结构例子。

,你有很多方法可以解决这个问题。我可以诚实地说,这可能取决于你认为重要的东西,也可能取决于你的编码风格和你的偏好。


吊起 这是一种非常简单的使用方法,您可以随意阅读更多内容,但简而言之,就是在文件开头声明一个变量,然后在以后某个时候使用它。但是对于函数,要使用这个概念,您需要做的就是将它们定义为传统函数。其思想是,当您使用关键字
function
定义函数时,函数基本上是在范围内的其他变量之前定义的

这里有一个小例子:

test();
功能测试(){
log(“Hello!:)”)

}
误解

我在
buildObjKey
之前定义
buildObjKey
并调用
buildObjKey
,而它尚未定义。。。这是一种糟糕的做法,但如果我将
buildObj
的定义移到
buildObjKey
之后,我将在定义之前调用
buildObj

那不是真的
buildObj
是一个函数,在定义
buildObjKey
之前不会调用它。
buildObj
包含对
buildObjKey
的引用这一事实并不意味着它试图立即调用它。为了具体演示这一点,让我们看下面的一个简化示例

请注意,
isEven
isOdd
如何在实际调用其中一个函数之前不生成输出-

函数isEven(n)
{console.log(“isEven”,n)
如果(n==0)
返回真值
其他的

return isOdd(n-1)//您是否考虑过使用currying?您是否考虑过将这些方法包装在一个静态类中?或者您是否考虑过类似于提升之类的东西?这段代码是什么?预期行为的定义是什么?现在它返回
[[[[“boo”]],“foo”]
有很多方法可以做到这一点。如果你解释一下逻辑,也许我们可以帮助你。这太令人困惑了。代码本身与问题无关。问题可以用以下代码概括:`function aaa(){bbb()}function bbb(){aaa()}`我们确实希望在定义前使用
bbb
。因此,您可以仅抑制linter警告。这不应该是一个错误。在这种情况下,ESLint不够聪明。请帮自己一个忙,改用TypeScript checker。您的帖子以“因此有许多方法可以解决此问题”为前提开始但是没有问题。
buildObj
在它被定义之前实际上并没有调用
buildObjKey
。OP已经编写了一对完全有效的函数。@谢谢你,我想我应该给出我的2¢, 我同意严格地说这不是一个问题,但我只是发现OP可能想探索基本上编写相同解决方案的不同方法。也就是说,这可能违反了他的公司编码风格指导原则?-我不知道足够的信息来说明这是不是真的,我对此表示怀疑,但我不正式知道W