如何使用点符号从对象创建路径?

时间:2016-10-18 11:59:12

标签: javascript object

我有一个嵌套对象,我不知道这个对象中的嵌套级别,现在我想将它的所有属性转换为prop.prop[0].prop之类的路径,之后我应该将所有主题保存在数组中。

nested_obj = {
  name: 'Saeid',
  images: [ { format: 'jpg', id: 23 }, { format: 'png', id: 30 }],
  ids: [ 2111, { id: [ 222, 'library'] } ]
}

paths_array = [ 'name', 'images[0].format', 'images[0].id', 'images[1].format', 'images[1].id' ]

我怎么能达到这个目标? 我有一个如下解决方案,它不适用于ids[1].id[0]

var make_path;

make_path = function(obj) {
  var Deep;
  Deep = function(o, paths, preKey) {
    var arrayKey, i, j, k, keys, l, len, ref, v;
    if (paths == null) {
      paths = [];
    }
    if (Array.isArray(o)) {
      for (i = j = 0, ref = o.length - 1; 0 <= ref ? j <= ref : j >= ref; i = 0 <= ref ? ++j : --j) {
        if (typeof o[i] !== 'object') {
          paths.push(preKey + "[" + i + "]");
          Deep(o[i], paths, preKey);
        } else {
          console.log(o[i]);
          arrayKey = preKey + "[" + i + "]";
          Deep(o[i], paths, arrayKey);
        }
      }
    } else if (o instanceof Object) {
      keys = Object.keys(o);
      for (v = l = 0, len = keys.length; l < len; v = ++l) {
        k = keys[v];
        if (typeof o[k] !== 'object') {
          if (preKey != null) {
            paths.push(preKey + "." + k);
          } else {
            paths.push(k);
          }
        }
        Deep(o[k], paths, k);
      }
    }
    return console.log(paths);
  };
  return Deep(obj);
};

1 个答案:

答案 0 :(得分:0)

我经常使用NPM库dot-object。它有一个简单的API,可用于序列化和反序列化为dot字符串。它也可以在节点应用程序或浏览器中使用。

https://www.npmjs.com/package/dot-object