javascript递归函数 求js高手解答,要实现一个根据路径获取json对象值的函数,有很多不明白的地方

javascript递归函数 求js高手解答,要实现一个根据路径获取json对象值的函数,有很多不明白的地方,第1张

递归经常碰到的问题了。

出问题的地方是 Run(temp,path);

既然是递归的调用 而且这个函数本身 有 return 值 那么 你应该在

调用 Run(temp,path);的时候 接收他的返回值

应该写成 value = Run(temp,path);

1 现在你可以设成 局部变量 var value 了。

之所以出现undefined就是因为

return value 这行代码 就执行了 1次 也就是 第一个执行 var test=Run(myjson,mypath);的时候

这个时候 value 变量还没有定义出来, value是在 最后一次执行 Run(temp,path);的时候才定义的,而需要把这个 返回出来 并接收 才有效。

2 json=json[path[0]],

这个地方 不会报错 你是写错了代码

你如果 把这个地方 写成 json=json[path[0]],

那么下面 Run(temp,path); 是不是也应该写成 Run(json,path);呢?

这样就不会报错。

3 在javascript里 数组和 对象 都是属于 引用类型的, 这是为了 节省内存空间。

其实道理简单, var a = {b:1} 这个时候 a变量里面 存储的是 保存这个 对象的内存地址,

打个比方 这个对象是一个宝箱 他是隐藏在内存的, a变量里面是打开这个宝箱的钥匙和地图

那么 b=a的时候 只是 复制了 钥匙和地图, 宝箱还是一个, 所以这个时候 a 和b 是指同一个对象的。

最后代码 修改后是这样

function Run(json,path){

if(pathlength<=1){

var value=json[path[0]]; // 如果这里换成var value=json[path[0]]结果是undefined

} else {

var temp;

json=json[path[0]]; //这里为什么不能用 json=json[path[0]]

pathsplice(0,1);

value = Run(json,path);

//argumentscallee(temp,path);

}

return value;

}

var myjson={a:1,b:{c:{e:3},d:4}};

var mypath=['b','c','e'];

var test=Run(myjson,mypath);

alert(test);

d3js是一个用于前端数据可视化的JavaScript库,其中包含一个用于创建树状图的模块。在使用d3js创建树状图时,我们可以通过异步方式一步步加载节点,以避免数据量过大而导致的性能问题。对于创建树状图时遇到的节点path路径错误问题,可能有以下原因和解决办法:1数据格式不对:如果数据格式不符合d3js对数据格式的要求,就会导致节点path路径不对。要解决这个问题需要检查数据格式是否正确。2缺少节点的子节点数据:如果节点的子节点数据没有成功加载到内存中,就会导致节点path路径不正确。要解决这个问题需要检查代码中子节点数据是否正确加载。3节点ID重复:如果树状图中的节点ID有重复,就会导致节点path路径错误。要解决这个问题,需要确保节点ID不重复。4资源路径错误:如果异步加载节点过程中,异步请求的资源路径不正确,也会导致节点path路径错误。要解决这个问题,需要确保资源路径正确。5给节点设置的path路径规则不正确:在d3js中,节点path路径通常是基于节点在树中的位置来计算的。如果节点path路径规则不正确,也会导致节点path路径错误。要解决这个问题,需要仔细检查节点path路径规则是否正确,并修改为正确的路径规则。延伸扩展:除了异步加载节点以避免性能问题外,还有一些其他方法可以优化d3js树状图的性能,例如:-针对大数据集,可以使用分层绘制等技巧来减少DOM元素数量,提升绘制效率-预处理数据,将原始数据转化为d3js树状图所需要的格式,避免在绘制过程中进行复杂计算-使用缓存机制,将已经绘制完成的图形缓存起来,避免重复计算-限定动画时间,减少动画时间,提高视觉效果和性能。

你应该回去找提供你这段代码的网页,看一下getPath函数的参数obj是什么,输入参数有什么要求。

就这段代码看,obj应该是一个对象,并且这个对象有select()方法;而恰好jQuery对象就有select()方法,有可能(仅仅是有可能)你需要将obj包装成jQuery对象后,再作为getPath函数的参数代入试试。

提示:

dom对象转为jQuery对象:有dom元素el,通过$(el) *** 作就可以转为jQuery对象

开始切入正题之前,有必要告知大家一下,这篇文章可能有一些深度,初学者可能理解会有些吃力。我会尽量把复杂问题简单化,争取让每个阅读的童鞋们都能看得懂。希望你对element-ui,vue-router,KeepAlive组件有一点了解。现在,我们开始吧。

熟悉element-ui的童鞋们都知道,ElMenuItem和ElSubMenu都需要一个index属性,该属性必须是唯一的。现在,我们想把路由配置直接应用于ElMenu,该如何确保index的唯一性呢?我们需要有一个生成唯一index的函数。如下是genKey函数的定义,是不是很简单?

现在,我们创建addRouteMetaKey函数,该函数对路由树进行递归遍历,为每一个路由配置的meta属性动态添加key字段。这个函数很简单,属于最基础的递归使用例子,我就不做太多解释了。

提示 :数组的forEach方法不是纯函数,因为它有副作用,所以forEach方法不能称之为函数式编程工具。

通过addRouteMetaKey函数,我们可以把路由的metakey作为index的值了。

现在,我们想实现另一个功能,就是 基于标签页的路由组件缓存控制 。使用过Vuejs KeepAlive组件的童鞋们,应该多多少少都遇到一些坑吧?在我们的项目中,有一个顶部标签页导航,每个tab项对应一个url,以每个url对应路由的title作为tab项标题,当切换tab的时候加载缓存中的url对应的路由组件,关闭tab项,下次打开该路由url,重新挂载对应的路由组件,而不是从缓存中加载。

当路由层级不确定的时候,KeepAlive会变的难以手动控制。所以,我 剑走偏锋,尝试了一种简单的解决方案 ,实践证明: 这是非常有效的 。我的方案就是把无限层级的路由树转化为一维数组。通过为meta添加必要的字段,进行页面结构个性化定制。

我们需要把每层路由配置的path转化为全路径,所以需要一个函数:getRouteFullPath,该函数定义如下:

getRouteFullPath函数中使用到的joinPath函数用于将多个路径字符串拼接为1个完整的路径,定义如下:

现在,我们把路由树转化为一维数组。我们定义toFlatRoutes函数,该函数使用了数组的reduce方法对路由树进行聚合递归,将路由配置中的path属性的值替换为全路径,还顺便给路由配置添加了name属性,返回一个新的一维路由配置数组。 这是函数式编程和递归结合的一个例子。

以上,我们解决了KeepAlive的缓存控制问题;现在,我们又有了一个新的用户体验上的需求,就是我们想根据url对应的路由,自动展开该路由metakey所属的侧边菜单;我们通过查阅element-ui文档得知,ElMenu有一个open方法,接收index作为参数,展开index对应的菜单。

现在的问题是,我们的路由对应的index是ElMenuItem的,而路由树已经被我们转化为了一维数组,通过路由的matched字段是得不到我们想要的菜单index的。所以, 我们需要遍历原始路由树

如下代码,我们定义getMenuKey函数,该函数接收的参数为route对象。如果路由存在,我们进行查找。首先进行简单查找,如果找到一个菜单menu,则返回该菜单的metakey;如果简单查找无果,则对路由树进行递归查找; 这是函数式编程和递归结合的另一个例子。

现在,我们大功告成了;以上就是本节的知识点,童鞋们理解了吗?只要我们熟悉递归的使用,其实 *** 作树很简单。如果大家还有不懂的,可以评论区问我。感谢阅读!

以上就是关于javascript递归函数 求js高手解答,要实现一个根据路径获取json对象值的函数,有很多不明白的地方全部的内容,包括:javascript递归函数 求js高手解答,要实现一个根据路径获取json对象值的函数,有很多不明白的地方、d3js树图异步加载节点path路径不对、jsp页面如何用js获取上传文件的真实路径,不通过修改浏览器设置的方式等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/10145412.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存