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