在递归JavaScript函数上使用或初始化局部变量的值

时间:2015-07-01 00:47:12

标签: javascript jquery json search

我想编写一个递归函数来解析嵌套的JSON。

以下是我的JSON外观:

var data = {
  a: {
    x: ["a", "b", "c", "d"],
  },
  b: {
    y: ["ab"],
    z: ["abc"],
  },
  c: ["a1", "b1"]
};

这是我写的:

var recurse = function(key, val) {
  window.mappedKey = window.mappedKey || '';
  if ($.type(val) === 'array') {
    if ($.inArray(search, val) >= 0) {
      window.mappedKey += key;
      alert(window.mappedKey);
    } else {
      window.mappedKey = '';
    }

  } else {
    window.mappedKey += key + '.';
    $.each(val, recurse);
  }
};

var search = 'ab';
$.each(data, recurse);

这里我使用全局window.mappedKey来存储递归的上一个键。它运行正常,但有任何方法可以通过在递归函数中使用局部变量来防止这种情况。

2 个答案:

答案 0 :(得分:1)

我不太明白mappedKey的目的,所以请耐心等待。

通常,当您想要将信息从一个函数实例传递给它调用的递归实例时,可以通过将信息作为参数传递给函数来实现。然后,该函数生成本地副本,根据需要对副本进行修改,然后使用 copy 调用自身。 (通过这种方式,它可以避免更改传递给 it 的原始值/列表。)当函数实例消失时,所有局部变量都会消失,因此也会复制它。

答案 1 :(得分:0)

有两种方法可以解决这个问题。

  1. 正如@MikeRobinson所说,你可以将值传递到recurse并存储为interally:

    for (var i in data) {
        if (data.hasOwnProperty(i)) {
           recurse(i, data[i], mappedKey);
        }
    }
    
  2. mappedKey值绑定到函数调用

    $.each(data, recurse.bind(null, mappedKey);
    
  3. 在数字2中,mappedKey将预先到参数。

    最终的函数看起来像(如下): 1。

        var recurse = function(key, val, mappedKey) {
            if ($.type(val) === 'array'){
                if($.inArray(search, val) >= 0){
                    mappedKey += key;
                }
                else {
                    mappedKey = '';
                }
            } else {
                mappedKey += key + '.';
    
                for (var i in val) {
                    if (val.hasOwnProperty(i)) {
                        recurse(i, val[i], mappedKey);
                    }
                }
            }
        };
    
        var search = 'ab';
        for (var i in data) {
            if (data.hasOwnProperty(i)) {
                recurse(i, data[i], '');
            }
        }
    

    2。

       var recurse = function(mappedKey, key, val) {
            if ($.type(val) === 'array'){
                if($.inArray(search, val) >= 0){
                    mappedKey += key;
                }
                else {
                    mappedKey = '';
                }
            } else {
                mappedKey += key + '.';
                $.each(val, recurse.bind(null, mappedKey));
            }
        };
    
        var search = 'ab';
        $.each(data, recurse.bind(null, ''));