在JavaScript中获取JSON对象的“路径”

时间:2016-03-25 00:12:12

标签: javascript angularjs json

我正在尝试获取AngularJS范围变量的“路径”而没有太多运气。我想最终传递“路径”以用作正在创建的一些动态表单的ng-model

到目前为止,这是我的代码:

my_code.js:

var my_data = {
  name: "fred",
  number: 1,
  children: [
    { name: "bob" },
    { name: "joe" },
    { name: "norman" },
  ]
};

function get_path(obj, target, path) {

  if (typeof path === "undefined" || path === null) { 
    path = "my_data";
  }

  for (var key in obj) {
    var value = obj[key];
    var value_type = value.constructor;

    /* value can either be an Array */
    if (value_type === Array) {
      for (var i=0; i<value.length; i++) {
        if (value[i] === target) {
          return path + "." + key + "[" + i + "]";
        }        
        var result = get_path(value, target, path + "." + key + "[" + i + "]");  
        if (result) {
          return result;
        }
      }
    }

    /* or an Object (dictionary) itself */
    else if (value_type === Object) {
      var result = get_path(value, target, path + "." + key);
      if (result) {
        return result;
      }
    }

    /* or something atomic (string, number, etc.) */
    else {
      if (value === target) {
        return path + "." + key;
      }
    }  
  }
  return false;
}

如果我将对象 my_data.children[0].name传递给此函数,我希望它返回字符串“my_data.children [0] .name”。但它实际上是返回“my_data.children [0] .0.name”。关于我哪里出错的任何想法?

P.S。 - 我从Javascript/JSON get path to given subnode?得到了最初的想法,但是没有处理数组。

2 个答案:

答案 0 :(得分:3)

我认为您的错误发生在:

else if (value_type === Object) {

      var result = get_path(value, target, path + "." + key);
      if (result) {
        return result;
      }
    }

你已添加“。” +键。只需删除它就像下面一样:

else if (value_type === Object) {

      var result = get_path(value, target, path  );
      if (result) {
        return result;
      }
    }

答案 1 :(得分:0)

@min-hong-tan解决了这个问题,应该是接受的答案。但为了完整起见,我添加了以下几行:

if (value === target) {
  return path + "." + key;
}

在每个if块之后,以防万一我尝试匹配整个数组(与my_data.children一样)或整个对象不属于一个数组。