js递归数组(js递归数组每层子的数量)

http://www.itjxue.com  2023-03-01 13:58  来源:未知  点击次数: 

JS实现数组排序的方法有哪些

从给定的数据中,随机抽出一项,这项的左边放所有比它小的,右边放比它大的,然后再分别这两边执行上述操作,采用的是递归的思想,总结出来就是 实现一层,分别给两边递归,设置好出口

function?fastSort(array,head,tail){

????//考虑到给每个分区操作的时候都是在原有的数组中进行操作的,所以这里head,tail来确定分片的位置

????/*生成随机项*/

????var?randomnum?=?Math.floor(ranDom(head,tail));

????var?random?=?array[randomnum];

????/*将小于random的项放置在其左边??策略就是通过一个临时的数组来储存分好区的结果,再到原数组中替换*/

????var?arrayTemp?=?[];

????var?unshiftHead?=?0;

????for(var?i?=?head;i?=?tail;i++){

??????if(array[i]random){

????????arrayTemp.unshift(array[i]);

????????unshiftHead++;

??????}else?if(array[i]random){

????????arrayTemp.push(array[i]);

??????}

??????/*当它等于的时候放哪,这里我想选择放到队列的前面,也就是从unshift后的第一个位置放置*/

??????if(array[i]===random){

????????arrayTemp.splice(unshiftHead,0,array[i]);

??????}

????}

????/*将对应项覆盖原来的记录*/

????for(var?j?=?head?,?u=0;j?=?tail;j++,u++){

??????array.splice(j,1,arrayTemp[u]);

????}

????/*寻找中间项所在的index*/

????var?nowIndex?=?array.indexOf(random);

????/*设置出口,当要放进去的片段只有2项的时候就可以收工了*/

????if(arrayTemp.length?=?2){

??????return;

????}

????/*递归,同时应用其左右两个区域*/

????fastSort(array,head,nowIndex);

????fastSort(array,nowIndex+1,tail);

??}

JavaScript实现多维数组、对象数组排序,其实用的就是原生的sort()方法,用于对数组的元素进行排序。

sort() 方法用于对数组的元素进行排序。语法如下:

arrayObject.sort(sortby)

例如:

function?NumAscSort(a,b)

{

?return?a?-?b;

}

function?NumDescSort(a,b)

{

?return?b?-?a;

}

var?arr?=?new?Array(?3600,?5010,?10100,?801);?

arr.sort(NumDescSort);

alert(arr);

arr.sort(NumAscSort);

alert(arr);

分享JS数组求和与求最大值的方法

前言

面试遇到一个问题:JS数组求和函数。我第一想到的就是数组循环。然而我觉得面试官问这个问题一定不是想考这个人人皆知的方法。当时机智的我竟然想到了递归函数不断加和数组的项,然而折腾了好久都没调好方法,事实证明这并不是最优解。最后面试官问我有没有见过reduce(),真木有哇。所以回来查资料,Array.reduce()是ES5新增的新属性,相似的还有Array.reduceRight()。

下文来总结一下数组求和的方法。

最粗暴的方法:循环获取

通过for循环一项项地加和。看代码:

Array.prototype.sum

=

function

(){

var

result

=

0;

for(var

i

=

0;

i

this.length;

i++)

{

result

+=

this[i];

}

return

result;

};

[1,4,7,2,10].sum();

//

24

使用reduce方法

利用reduce方法,可以写一个数组求和的sum方法。

reduce()方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终为一个值。

reduce的语法:

array.reduce(callback[,

initialValue]);

callback函数接受4个参数:previousValue(上次调用回调返回的值)、currentValue(当前被处理的元素)、index(索引)以及数组本身(第一次调用

callback的第一个参数),执行数组中每个值的函数。

initialValue参数可选,表示初始值;initialValue参数若指定,则当作最初使用的previous值,如果缺省,则使用数组的第一个元素作为previous初始值,同时current往后排一位。

Array.prototype.sum

=

function

(){

return

this.reduce(function

(partial,

value){

return

partial

+

value;

})

};

[1,4,7,2,10].sum();

//

24

相比第一种方法,使用reduce()方法的效率更高。

这两种方法的效率比较可以直接在函数运行前后分别调用new

Date()获取即时时间,从而通过时间差比较执行时间。这里就不比较了,因为每个人的执行环境差异较大。测试结果是reduce()方法的执行时间更短。

JS数组求和函数,并求出数组中的最大值

实例代码

!DOCTYPE

html

PUBLIC

"-//W3C//DTD

XHTML

1.0

Transitional//EN"

""

html

xmlns=""

head

meta

http-equiv="Content-Type"

content="text/html;

charset=gb2312"

/

title脚本之家_js数组求和和最大值方法_脚本之家网/title

meta

name="keywords"

content="站长,网页特效,网页特效代码,js特效,js脚本,脚本,广告代码,jb51.net,,脚本之家网"

/

meta

name="description"

content=",脚本之家网,站长必备js特效及广告代码。大量高质量js特效,提供高质量广告代码下载,尽在脚本之家网"

/

/head

body

a

href=""脚本之家网/a,站长必备的高质量网页特效和广告代码。jb51.net,站长js特效。hr

script

type="text/javascript"

//求和

Array.prototype.sum

=

function

()

{

for

(var

sum

=

i

=

0;

i

this.length;

i++)sum

+=

parseInt(this[i]);

return

sum

;

};

//求最大值

Array.prototype.maxima

=

function

()

{

for

(var

i

=

0,

maxValue

=

Number.MIN_VALUE;

i

this.length;

i++)parseInt(this[i])

maxValue

(maxValue

=

this[i]);

return

maxValue;

};

//应用

var

arr

=

[1,21,3,4,22,45,60,7,32];

alert(arr.join("+")

+

"="

+

arr.sum());

alert(arr.join("|")

+

"中,

最大的数是:"

+

arr.maxima());

/script

/body

/html

以上就是本文的全部内容,希望对大家使用JavaScript有所帮助哦,如果有疑问的话欢迎留言讨论,小编会及时回复大家的。

js递归时有多个结束条件的实现方法

// 数组中表示前一种语言对后一种语言有影响var influences = [

['Lisp', 'Smalltalk'],

['Lisp', 'Scheme'],

['Smalltalk', 'Self'],

['Scheme', 'JavaScript'],

['Scheme', 'Lua'],

['Self', 'Lua'],

['Self', 'JavaScript']];// 获得受某种语言直接影响的语言的列表function nexts(graph, node) { ?if (_.isEmpty(graph)) return []; ?var pair = _.first(graph); ?var from = _.first(pair); ?var to ? = second(pair); ?var more = _.rest(graph); ?if (_.isEqual(node, from)) ? ?return construct(to, nexts(more, node)); ?else

return nexts(more, node);

}

nexts(influences, 'Lisp');// 输出: ["Smalltalk", "Schema"];

后面又给了一个练习题,让nexts能够遍历多个节点。我理解这个练习题的要求是:

参数:influences, nodes (例如['Lisp', 'Self'])

输出:

{

Lisp: ["Smalltalk", "Schema"],

Self: ["Lua", "JavaScript"]

感觉这个递归有两个结束条件:

_.isEmpty(graph)?表示当前节点递归完了

_.isEmpty(nodes)?表示所有节点递归完了

想了半天,除了在nexts外层套一个循环外,没能写出很好的递归方法。

希望各路大神能给一个思路,如果能给出一个多条件递归时的思路总结,说明一下这种问题应如果分解,就再好不过了。

写了一个示例,里面包含了执行环境和用到的工具函数,可以在这里实验。

JavaScript如何遍历多维数组,采用递归的方式

function getArrayValue(){ var arr = new Array(['a','b','c'],['d','e','f']);//二维数组 for(i=0;iarr.length;i++){ var tmpArr = new Array(); tmpArr = arr[i]; for(j=0;jtmpArr.length;j++){ var tmp = tmpArr[j]; alert(tmp); } } } 给你一个例子,多维的话可以在循环。(可能方法比较笨,但是好用)

JS根据子节点递归获取所有父节点的集合

//传入参数:需要遍历的对象,需要匹配的id,获取所有的父级节点的Id

? ? ? ??function?findIdList(data2,?id,?children?=?'children',?level?=?0)?{

??var?arrRes?=?[];

??let?obj?=?{

??????id:?0,

??????[children]:?data2

??}

??let?rev?=?(data,?id,?level)?=?{

????if?(!data?||?!data[children]?||?!data[children].length)?{

??????return;

????}

????for?(var?i?=?0;?i??data[children].length;?i++)?{

??????let?item?=?data[children][i];

??????if?(item.id?==?id)?{

????????//?将匹配到的结果保存到数组

????????arrRes.unshift({?level,?activeId:?item.id?});

????????//?递归它的父级

????????rev(obj,?data.id,?0);

????????break;

??????}?else?if?(item[children]??item[children].length??0)?{

????????//如果有子集,则把子集作为参数重新执行本方法

????????rev(item,?id,?level?+?1);

??????}

????}

??};

??rev(obj,?id,?level);

??return?arrRes;

}

let?list?=?[

????{id:?1,?children:?[

????????{id:?11,?children:?[{id:?12}]}

????]},

????{id:?2,?children:?[{id:21,?children:?[{id:?31}]}]}

]

let?b?=?findIdList(list,?21)

console.log(b)?//?[?{?level:?0,?activeId:?2?},?{?level:?1,?activeId:?21?}?]

(责任编辑:IT教学网)

更多

相关Frontpage教程文章

推荐Frontpage教程文章