js递归数组(js递归数组每层子的数量)
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
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?}?]