检索对象项的路径

Retrieve Path of Object items

本文关键字:路径 对象 检索      更新时间:2023-09-26

我想知道是否可以检索javascript对象包含的所有路径

例:

obj = {
  prop1 : {
    x: 19
    y: 43
  }
  prop2 : {
    another: {
      here: 1
    }
  }
  prop3: "hello"
}

其中结果将是一个包含以下元素的数组:

Result: ["prop1.x", "prop1.y", "prop2.another.here", "prop3"]

这可能吗?

谢谢!

function flattenKeys(obj, delimiter) {
    delimiter = delimiter || '.';
    return recurse(obj, '', []);
    function recurse(obj, path, result) {
        if (typeof obj === "object") {
            Object.keys(obj).forEach(function (key) {
                recurse(obj[key], path + delimiter + key, result);
            });
        } else {
            result.push(path.slice(delimiter.length));
        }
        return result;
    }
}

用作

var obj = {
  prop1 : {
    x: 19,
    y: 43
  },
  prop2 : {
    another: {
      here: 1
    }
  },
  prop3: "hello"
};
flattenKeys(obj);
// -> ["prop1.x", "prop1.y", "prop2.another.here", "prop3"]

没有字符串操作的替代实现:

function flattenKeys(obj, delimiter) {
    delimiter = delimiter || '.';
    return recurse(obj, [], []);
    function recurse(obj, path, result) {
        if (typeof obj === "object") {
            Object.keys(obj).forEach(function (key) {
                path.push(key);
                recurse(obj[key], path, result);
                path.pop();
            });
        } else {
            result.push(path.join(delimiter));
        }
        return result;
    }
}

在托马拉克在这里整理时写的。递归是执行此操作的明显方法。

var inputObject = {
    prop1: {
        x: 19,
        y: 43
    },
    prop2: {
        another: {
            here: 1
        }
    },
    prop3: "hello"
};
function getProps(obj) {
  var props = [];
  var findPropsRecursive = function (robj, str) {
    robj = robj || {};
    var keys = Object.keys(robj);
    if (keys.length > 0 && (robj instanceof Object)) {
      return keys.map(function (key) {
        return findPropsRecursive(robj[key], str + (str ? '.' : '') + key);
      });
    } else {
      props.push(str);
      return '';
    }
  };
  findPropsRecursive(obj, '');
  return props;
}
console.log(getProps(inputObject));

在JSFIDDLE上:http://jsfiddle.net/jkoudys/w49rcp40/