【问题标题】:Accessing part of an object using path使用路径访问对象的一部分
【发布时间】:2019-01-07 16:22:42
【问题描述】:

有一个如下所示的对象:

const arrObj = [
{
   name: 'FolderA',
   path: '/',
   child: [
     {
       name: 'FolderB',
       path: '/FolderA',
       child: [
         {
           name: 'FolderC0',
           path: '/FolderA/FolderB',
           child: [],
         },
         {
           name: 'FolderC1',
           path: '/FolderA/FolderB',
           child: [],
         },
       ],
     },
   ],
 },
 {
   name: 'FolderM',
   path: '/',
   child: [],
 },
];

如果我将路径作为字符串:

var path = '/FolderA/FolderB', 

我能否使用数组 reduce 访问 FolderB 内对象的子部分? 尝试失败:

var res = path.split('/').reduce(function(o, k) {
 return o && o[k];
}, arrObj);

【问题讨论】:

  • 没有名为FolderA 的属性。您需要找到具有该名称的对象。
  • 老实说,我不喜欢那种 JSON 结构。为什么你需要path 属性?我的意思是,您到底想如何解析,您要寻找什么道具?编辑:可以有多种方法,例如检查路径是否匹配或通过name 属性。
  • 我也不喜欢它,但它是我必须使用的,所以将路径作为字符串我必须以某种方式访问​​它的一部分,所以我可以操纵它:(跨度>
  • @Nika 对我来说似乎是一个很好的结构,是的,您可能会争辩说 path 可以变得多余,但在此处存储 path 的一个优点是文件夹项目可以发送到另一个函数,path 也在那里,否则会丢失。

标签: javascript iteration


【解决方案1】:

使用Array#reduceArray#find

const path = '/FolderA/FolderB'
const data =[{name:'FolderA',path:'/',child:[{name:'FolderB',path:'/FolderA',child:[{name:'FolderC0',path:'/FolderA/FolderB',child:[],},{name:'FolderC1',path:'/FolderA/FolderB',child:[],},],},],},{name:'FolderM',path:'/',child:[],},]

const res = path.slice(1).split("/").reduce((a,c)=>{
  return a.find(({name})=> name === c).child;
 }, data);

console.log(res);

测试:

const data=[{name:'FolderA',path:'/',child:[{name:'FolderB',path:'/FolderA',child:[{name:'FolderC0',path:'/FolderA/FolderB',child:[],},{name:'FolderC1',path:'/FolderA/FolderB',child:[{name:'FolderD0',path:'/FolderA/FolderB/FolderC1',child:[]}],},],},],},{name:'FolderM',path:'/',child:[],},]

function find(path){return path.slice(1).split("/").reduce((a,c)=>a.find(({name})=>name===c).child,data)}


console.log(find("/FolderA"));
console.log(find("/FolderA/FolderB"));
//no children so should be empty
console.log(find("/FolderA/FolderB/FolderC0"));
//Not empty
console.log(find("/FolderA/FolderB/FolderC1"));

【讨论】:

  • 这在更深层次上不起作用。您仅将其限制为 2 个级别。尝试将 '/FolderA/FolderB/FolderC0' 作为 pth。
  • @Nika 为什么不能超过 2 个级别?它为 FolderC0 返回一个空数组,因为没有子节点。
  • 我的意思是,即使你在那里添加数组,它也会有同样的问题。编辑:我的意思是,它应该是递归的,而不是一个单一的 reduce。
  • 编辑:对不起,我在这里遇到了案例问题,请忽略我。
  • @kemicofa - 非常感谢好友 :)
猜你喜欢
  • 2019-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-16
  • 2014-12-18
  • 1970-01-01
  • 2021-04-02
  • 2013-09-26
相关资源
最近更新 更多