本发明涉及到程序设计技术领域,尤其涉及一种命令行中浏览编辑对象的方法。
背景技术:
在nodejs命令行环境中,如果一个对象内部所包含的内容过多,属性的深度过深,会导致在命令行打印的时候无法看到过深的内容(被忽略了),或者在一般的查看情况下查看具体内容很不方便。这个问题是一个本质的问题。因为一个对象的展开深度理论上可以无限之深。如果将其全部打印下来,命名行无法容纳。同时,如果在nodejs运行的过程中,需要程序停下来在命令行中实时地更改某个对象的内容,现有的方法无法做到。
我们提出一种探索式浏览编辑对象的方法,这样可以提供一种交互式的浏览方式,使得对象的不同部分,不同深度层级可以逐渐地展开。而用户可以在这种交互式的浏览过程中选择自己感兴趣的方面进行浏览,不必担心一次性从过多的内容中选择从而找不到自己要看的内容。同时,我们提供的编辑对象的方式,也使得运行时从命令行编辑对象成为可能,成为编程调试和服务器线上维护的有力方法。
为了解决上述技术问题,本发明设计了一种命令行中浏览编辑对象的方法,该命令行中浏览编辑对象的方法解决了命令行中普通打印对象无法显示全部的问题;提供了优雅的探索式浏览方案,可以对于nodejs内存当中的任意对象进行探索。提供按照命令探索,全面打印,缩略打印,自动浏览等浏览方式;解决了命令行中运行时无法更改内存对象的问题。可以更改任意对象的任意字段。当然,要在恰当的时机使用;为各种编程调试,服务器线上维护,提供了一种较好的解决方案,有助于提高开发效率,运维排错效率和内容运营效率。
技术实现要素:
为了克服背景技术中存在的缺陷,本发明解决其技术问题所采用的技术方案是:一种命令行中浏览编辑对象的方法,其特征在于其步骤为:
(1)、首先,在命令行环境中实现一个repl环境,也就是read-eval-print-loop,这个repl环境能够接受不同的命令注册,每当敲入不同的命令时,可以进行相应命令的执行函数,执行结束之后,可以等待用户的输入,再次接受新的命令;
(2)、在repl环境中注册如下的命令及其执行函数:
1、pwd命令,含义是列出当前所在的对象路径;
2、cd命令,参数是子路径subpath,含义是进入指定路径,如果子路径为空,则为当前路径,如果子路径为’..’,则跳转到上一层路径,如果子路径为’...’,则跳转到浏览开始的路径,如果指定路径不存在,则输出‘指定路径不存在’;
3、ls命令,参数是子路径subpath,含义是列出指定路径下所看到的当前对象的展开可能性,包括对象类对象和一般对象,两者用不同颜色表示,仅列出指定路径的情况,并不进入该路径;
4、v命令,参数是子路径subpath,含义是对于指定路径中的对象执行view操作,而不进入该路径,view的意思就是利用js默认的屏幕打印方式打印全部内容;
5、vs命令,参数是子路径subpath,横向展开宽度k,纵向展开深度h,含义是对于指定路径中的对象进行view_summary操作,而不进入该路径,view_summary的意思就是利用我们给出的缩略模式对于对象进行查看,这一缩略模式的意义在于对于每个层级的子对象展开,仅打印前k个子对象,并且递归如此,最大递归深度为,k默认为5,h默认为4,因为js默认的屏幕打印方式最多只会显示4层内容;
6、keys命令,参数是子路径subpath,含义是列出指定路径的对象的所有键,等价于ls+子路径;
7、values命令,参数是子路径subpath,含义是列出指定路径的对象的所有值;对于每个值,调用js默认的屏幕打印方式,如果该对象不是object类型,则报告该对象不是object类型;
8、auto命令,参数是子路径subpath,含义是对于指定路径的对象,进行自动浏览auto操作;auto操作的意思是,对于对象进行广度优先遍历;对于每个遍历的对象,进行view_summary操作;并且列出每个当前对象的所在路径;从而实现自动化的浏览对象的所有内容;因为这个浏览过程可能会是无限或者超级长的;所以提供ctrl+c的退出模式;
9、replace命令,参数是子路径subpath,替换为的内容obj,含义是对于指定路径的对象,进行完全的替换;替换为obj的对象;可以对根对象进行完全的替换;
10、update命令,参数是子路径subpath,更新的内容obj,含义是对于指定路径的对象,进行更新操作;更新操作不会完全替换原有内容,只是使得相应的键上确定为相应的值obj;
11、remove命令,参数是子路径subpath,含义是对于指定路径的对象,进行删除操作,删除后该路径不再存在。
算法列表:算法main(r)主干算法
输入:1.根据objectexplorer函数入口的对象为r。
准备参数:2.设置当前路径current_path为””。
算法:3.repl接受命令。如果命令为:
4.‘pwd’:则打印当前对象的路径current_path
5.‘cd+子路径subpath’:则测试指定路径是否存在(算法checkpath(入口对象
r,当前路径current_path+子路径subpath))。如果存在,则将当前路径current_path设置为current_path+子路径。
6.‘ls+子路径subpath’:测试指定路径是否存在。如果存在,且其对象为o,则列举o对象的所有键(利用object.keys(o))进行打印。打印时对于这些键的每个值进行类型判断。如果其类型为object,则打印为白色,如果为其他类型,则打印为蓝色。
7.‘v+子路径subpath’:测试指定路径是否存在。如果存在,且其对象为o,则调用系统默认打印函数console.log打印o对象。
8.‘vs+子路径subpath+横向展开宽度k+纵向展开深度h’:测试指定路径是否存在。如果存在,且其对象为o,则调用viewsummary(o,k,h)算法进行缩略式打印。
9.‘keys+子路径subpath’:等价于‘ls+子路径subpath’命令。
10.‘values+子路径subpath’:测试指定路径是否存在。如果存在,且其对象为o,则列举o对象的所有值(利用object.keys(o)得到所有键之后,在对象o上进行map得到所有values)进行打印。
11.‘auto+子路径subpath’:测试指定路径是否存在。如果存在,且其对象为o,对于对象o进行广度优先遍历。对于每个遍历的对象,列出它的所在路径(pwd),进行viewsummary操作。
12.‘replace+子路径subpath+希望替换为的内容obj’:测试指定路径是否存在。如果存在,且其对象为o,则将该对象的所有键清空,然后将obj的每个键值对赋予给对象o。
13.‘update+子路径subpath+希望更新的内容obj’:测试指定路径是否存在。如果存在,且其对象为o,则将obj的每个键值对赋予给对象o,并不清空o的原有键。
14.‘remove+子路径subpath’:测试指定路径是否存在。如果存在,且其对象为o,则删除该对象。如果子路径subpath为空,即,当前路径对象被删除,则利用checkpath(r,path+‘..’)上跳一级到达父对象,同时设定当前对象为父对象的path。如果是入口对象r被删除,则跳出repl,退出程序。
15.如果运行中遇到用户输入ctrl+c命令,则跳出repl,退出程序。
16.如果不为以上4-15的任何情况,或者以上4-14的情况执行完成,repl会自动回到3,等待用户输入,继续执行。
输出17.无输出
算法checkpath(r,path)检查路径算法
输入:1.入口对象r
2.指定路径path
准备参数:
3.真实路径数组arr
4.当前对象o,设置为r
算法:
5.将路径path根据‘.’划分为数组arr0,如果路径中存在..,则单独将其列为数组的一项’..’
6.对于上述数组arr0,从头到尾遍历,对于一个对象item,如果它不是’..’,则将其置于真实路径数组arr中,如果一个对象是’..’,则将真实路径数组arr的最后一个对象弹出(arr的总长度减1)。如果执行这个操作之前发现arr的长度已经为0,则打印“路径不存在”,退出算法,返回null(空对象)。
经过这个遍历,arr准备好为真实路径。
7.对于arr,从头到尾遍历,对于一个对象item,如果当前对象o的子键中不存在item,则打印“路径不存在”,退出算法,返回null;如果存在,则将o设置为o[item]。遍历结束则算法结束并且输出。
输出:
8.null(空对象)或对象o
算法viewsummary(o,k,h)缩略查看算法
输入:
1.指定对象o
2.横向展开宽度k
3.纵向展开深度h
准备参数:
4.缩略对象s设置为{}空对象
5.指定对象索引op设置为o
6.缩略对象索引sp设置为s
7.缩略对象索引当前深度sh设置为0
算法:
8.对于指定对象索引op,取其前k个键(利用object.keys(op)),如果总共少于k个键,则取所有键。对于这k个键的每一个,执行如下操作:
9.对于k键。如果op[k]的类型为非object类型且非空,则在sp上设置键值对k,op[k],否则在sp上设置键值对k,{}。
10.在sp上设置键值对length,object.keys(op).length,即将op的键长度标注到sp上。
11.如果当前深度sh大于纵向展开深度h,停止执行子算法。
12.否则,对于sp上的k个键,在op上取值得到op[k],在sp上取值得到sp[k],以op[k]和sp[k]分别为op和sp,执行算法8。
13.每个小的算法8会在它的11环节,或12环节结束,从而导致大的算法8最终结束。
输出:
14.对象s
本发明设计了一种命令行中浏览编辑对象的方法,该命令行中浏览编辑对象的方法解决了命令行中普通打印对象无法显示全部的问题;提供了优雅的探索式浏览方案,可以对于nodejs内存当中的任意对象进行探索。提供按照命令探索,全面打印,缩略打印,自动浏览等浏览方式;解决了命令行中运行时无法更改内存对象的问题。可以更改任意对象的任意字段。当然,要在恰当的时机使用;为各种编程调试,服务器线上维护,提供了一种较好的解决方案,有助于提高开发效率,运维排错效率和内容运营效率。
具体实施方式
具体实施例,一种命令行中浏览编辑对象的方法,其特征在于其步骤为:
(1)、首先,在命令行环境中实现一个repl环境,也就是read-eval-print-loop,这个repl环境能够接受不同的命令注册,每当敲入不同的命令时,可以进行相应命令的执行函数,执行结束之后,可以等待用户的输入,再次接受新的命令;
(2)、在repl环境中注册如下的命令及其执行函数:
1、pwd命令,含义是列出当前所在的对象路径;
2、cd命令,参数是子路径subpath,含义是进入指定路径,如果子路径为空,则为当前路径,如果子路径为’..’,则跳转到上一层路径,如果子路径为’...’,则跳转到浏览开始的路径,如果指定路径不存在,则输出‘指定路径不存在’;
3、ls命令,参数是子路径subpath,含义是列出指定路径下所看到的当前对象的展开可能性,包括对象类对象和一般对象,两者用不同颜色表示,仅列出指定路径的情况,并不进入该路径;
4、v命令,参数是子路径subpath,含义是对于指定路径中的对象执行view操作,而不进入该路径,view的意思就是利用js默认的屏幕打印方式打印全部内容;
5、vs命令,参数是子路径subpath,横向展开宽度k,纵向展开深度h,含义是对于指定路径中的对象进行view_summary操作,而不进入该路径,view_summary的意思就是利用我们给出的缩略模式对于对象进行查看,这一缩略模式的意义在于对于每个层级的子对象展开,仅打印前k个子对象,并且递归如此,最大递归深度为,k默认为5,h默认为4,因为js默认的屏幕打印方式最多只会显示4层内容;
6、keys命令,参数是子路径subpath,含义是列出指定路径的对象的所有键,等价于ls+子路径;
7、values命令,参数是子路径subpath,含义是列出指定路径的对象的所有值;对于每个值,调用js默认的屏幕打印方式,如果该对象不是object类型,则报告该对象不是object类型;
8、auto命令,参数是子路径subpath,含义是对于指定路径的对象,进行自动浏览auto操作;auto操作的意思是,对于对象进行广度优先遍历;对于每个遍历的对象,进行view_summary操作;并且列出每个当前对象的所在路径;从而实现自动化的浏览对象的所有内容;因为这个浏览过程可能会是无限或者超级长的;所以提供ctrl+c的退出模式;
9、replace命令,参数是子路径subpath,替换为的内容obj,含义是对于指定路径的对象,进行完全的替换;替换为obj的对象;可以对根对象进行完全的替换;
10、update命令,参数是子路径subpath,更新的内容obj,含义是对于指定路径的对象,进行更新操作;更新操作不会完全替换原有内容,只是使得相应的键上确定为相应的值obj;
11、remove命令,参数是子路径subpath,含义是对于指定路径的对象,进行删除操作,删除后该路径不再存在。
本发明设计了一种命令行中浏览编辑对象的方法,该命令行中浏览编辑对象的方法解决了命令行中普通打印对象无法显示全部的问题;提供了优雅的探索式浏览方案,可以对于nodejs内存当中的任意对象进行探索。提供按照命令探索,全面打印,缩略打印,自动浏览等浏览方式;解决了命令行中运行时无法更改内存对象的问题。可以更改任意对象的任意字段。当然,要在恰当的时机使用;为各种编程调试,服务器线上维护,提供了一种较好的解决方案,有助于提高开发效率,运维排错效率和内容运营效率。
显然,上述实施例仅仅是为清楚地说明所作的举例,而并非对实施方式的限定。对于所属领域的普通技术人员来说,在上述说明的基础上还可以做出其它不同形式的变化或变动。这里无需也无法对所有的实施方式予以穷举。而由此所引伸出的显而易见的变化或变动仍处于本发明创造的保护范围之中。