Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/478.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_Arrays_Recursion - Fatal编程技术网

Javascript 递归函数输出双重结果?

Javascript 递归函数输出双重结果?,javascript,arrays,recursion,Javascript,Arrays,Recursion,我对编写递归函数还不熟悉,对某些东西有点执着。我不明白为什么这个函数输出到控制台两次。。。看一看: keyName='code' // check, recursively, if an object contains an array let concatObject = function(obj) { // get the keys of the parent object let keys = Object.keys(obj); // for each child

我对编写递归函数还不熟悉,对某些东西有点执着。我不明白为什么这个函数输出到控制台两次。。。看一看:

keyName='code'

// check, recursively, if an object contains an array
let concatObject = function(obj) {
    // get the keys of the parent object
    let keys = Object.keys(obj);
    // for each child object in the parent object
    for (let i = 0; i < keys.length; i++) {
        // get the current child
        let key = keys[i];
        // get the keys of the current child
        let intKeys = Object.keys(obj[key]);
        // for each child object in the child object
        for (let p = 0; p < intKeys.length; p++) {
            // get the nested child
            let intKey = intKeys[p];
            // if it's an array, repeat above steps by calling current function
            if (!Array.isArray(obj[i][intKey])) {
                // if it's not an array, get the value according to the passed keyName, checking for undefined
                if (typeof obj[i][keyName] !== 'undefined') {
                    console.log(obj[i][keyName]);
                }
            } else {
                console.log('FOUND ARRAY');
                concatObject(obj[i][intKey]);
            }
        }
    }
};
预期的输出为:

10
10
FOUND ARRAY
10_34
10_34
10_35
10_35
10_36
10_36
10_37
10_37
10_38
10_38
10_39
10_39
10_40
10_40
10_41
10_41
10_42
10_42
10_43
10_43
10_44
10_44
10_45
10_45
10_46
10_46
10_47
10_47
10_48
10_48
10_49
10_49
10_50
10_50
10_51
10_51
10_52
10_52
10_53
10_53
10_54
10_54
10_55
10_55
10_57
10_57
10_58
10_58
FOUND ARRAY
过滤器正在工作(传递的keyName是'code',因此不应该显示双嵌套数组键名),但是在我当前的实现中,我在这里使用的任何逻辑都将触发两次,我不希望这样


感谢大家的帮助

感谢@Cmaddux指出我逻辑中的缺陷。由于我正在迭代每个对象中存在的每个键,因此我需要确保函数仅在满足正确的条件时才起作用,即在对传递的值
keyName
起作用时起作用

将我的IF条件更改为此解决了此问题:

if((对象[i][keyName]的类型)!=='undefined')&&intKey=='keyName)


经验教训:永远不要假设。我还以为这是递归堆栈中的一些古怪的东西,但很低,看哪,人为错误占了上风。

我刚刚意识到我没有展示如何调用函数。我在switch语句中这样做:
concatObject(obj)并且我100%确定我会调用它一次(最初)。对于子类别数组中的每个对象,内部循环(var p)将循环两次,对于对象中的每个键(“代码”和“名称”)循环一次。它将在每个循环中记录“code”的值,因为您已经将其硬编码为keyName var的值。尝试将console.log(obj[i][keyName])更改为console.log(obj[i][intKey]),您的问题会更清楚一点,预期的输出是什么<代码>concat(obj)
没有意义。Concat obj to/with what?逻辑将向对象键名称添加后缀和可选前缀(字符串或字符串数组)——基本上是编写一个序列化程序,根据传递的字符串输出类似SQL的查询或其他任何内容。这一部分是有效的,但它会发生两次。记录
ob[i][intKey]
将产生预期的输出(每个键值对,仅一次)…如果您否决投票,请随意说出原因,我将尝试更正或改进问题。没有反馈的否决投票有点丰富——分享就是关心——让我们以建设性的方式分享我们的批评和解决方案。谢谢
10
10
FOUND ARRAY
10_34
10_34
10_35
10_35
10_36
10_36
10_37
10_37
10_38
10_38
10_39
10_39
10_40
10_40
10_41
10_41
10_42
10_42
10_43
10_43
10_44
10_44
10_45
10_45
10_46
10_46
10_47
10_47
10_48
10_48
10_49
10_49
10_50
10_50
10_51
10_51
10_52
10_52
10_53
10_53
10_54
10_54
10_55
10_55
10_57
10_57
10_58
10_58
FOUND ARRAY