【问题标题】:Get the "path" of a JSON object in JavaScript在 JavaScript 中获取 JSON 对象的“路径”
【发布时间】:2016-03-25 00:12:11
【问题描述】:

我正在尝试获取 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;
}

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

附: - 我从Javascript/JSON get path to given subnode? 得到了最初的想法,但它并没有处理数组。

【问题讨论】:

    标签: javascript angularjs json


    【解决方案1】:

    我认为你的错误在于:

    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;
          }
        }
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-12
        • 2021-05-31
        • 2021-11-27
        • 1970-01-01
        • 1970-01-01
        • 2015-11-15
        • 1970-01-01
        • 2018-12-19
        相关资源
        最近更新 更多