js为嵌套属性生成路径字符串

时间:2018-04-25 15:11:32

标签: javascript

我有一个具有嵌套属性的对象:

{ 
    a: { 
        b: { 
            c: { min: 1, max: 2  }, 
            d: 1 
        }
    }
 }

嵌套可以是任何深度级别。它以具有其中一个属性(min,max,in)或非对象(string,number,bool)的对象结束

我想为这些端点的路径生成一个字符串。

E.g。对于上面的对象,我想得到以下结果:

objPaths(a)

=> {
     "a.b.c": { min: 1, max: 2 }
     "a.b.d": 1 
   }

2 个答案:

答案 0 :(得分:0)

您可以使用for...in循环为此创建递归函数。此外,如果当前属性的值是对象,则需要在进入下一级别之前检查某些键是min还是max



const obj = {"a":{"b":{"c":{"min":1,"max":2},"d":1}}}

const objPaths = (obj, paths = {}, prev = '') => {
  for (let key in obj) {
    let str = (prev ? prev + '.' : '') + key;
    if (typeof obj[key] != 'object') paths[str] = obj[key];
    else if (Object.keys(obj[key]).some(k => ['min', 'max'].includes(k))) paths[str] = obj[key];
    else objPaths(obj[key], paths, str)
  }
  return paths
}

const result = objPaths(obj);
console.log(result)




答案 1 :(得分:0)

您可以采用迭代和重复方法并检查对象是否包含minmax个键,然后获取对象或值,否则将对象包含在内。

function getPath(object) {
    function iter(o, p) {
        if (o && typeof o === 'object' && !['min', 'max'].some(k => k in o)) {
            Object.entries(o).forEach(([k, v]) => iter(v, p + (p && '.') + k));
            return;
        }
        result[p] = o;
    }

    var result = {};
    iter(object, '');
    return result;
}

console.log(getPath({ a: { b: { c: { min: 1, max: 2 }, d: 1 } } }));