按部分路径过滤对象

asd*_*asd 4 javascript

如何过滤给定部分路径的对象?

举个例子。

let address  = {
  country :{
    name:'Japan',
    city:{
      name:'Tokyo',
      town: {
        name:'korushawa'
      }
    },
    code:'JP'
  },
  nearbyCountry:'Korea'
}
Run Code Online (Sandbox Code Playgroud)

路径1countr.cit

对于addresspath1 将导致

{
  country :{
    city:{
      name:'Tokyo',
      town: {
        name:'korushawa'
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


路径2:国家

对于path2,我应该得到整个address对象,因为countr存在于countrynearbyCountry

{
  country :{
    name:'Japan',
    city:{
      name:'Tokyo',
      town: {
        name:'korushawa'
      }
    }
  },
  nearbyCountry:'Korea'
}
Run Code Online (Sandbox Code Playgroud)

编辑:当给出确切的路径(例如:)时,我已经能够解决这个问题country.city。但是在部分路径上有困难。

Nin*_*olz 5

这种方法依赖于过滤条目并通过映射具有单个属性的对象来重建新对象。

function getParts(object, fragments) {
    var [part, ...rest] = fragments.split('.');

    return Object.assign({}, ...Object
        .entries(object)
        .filter(([key]) => key.toLowerCase().includes(part))
        .map(([k, v]) => {
            if (!rest.length) return { [k]: v };
            var parts = v && typeof v === 'object' && getParts(v, rest.join('.'));
            if (parts) return { [k]: parts };
        })
    );
}

let address = { country: { name: 'Japan', city: { name: 'Tokyo', town: { name: 'korushawa' } }, code: 'JP' }, nearbyCountry: 'Korea' };

console.log(getParts(address, 'countr.cit'));
console.log(getParts(address, 'countr'));
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }
Run Code Online (Sandbox Code Playgroud)