文档章节

js 排序 循环

 甜酒0917
发布于 2017/07/12 17:54
字数 466
阅读 27
收藏 0

forEach用法:

var a="2,78,5,6,87,34,65,23,5,22,67,889,3,45,78,3,453545434,323232,25656565,333334,222222222";
//用空间换时间算法
	function sortA(s){
		var ary=s.split(",");
		var temp=[];
		var result=[];
		ary.forEach(function(item){
			if(temp[item]==undefined){
				temp[item]=1;
			}else{
				temp[item]++;
			}
		});
		temp.forEach(function(item,index){
			while(item-->0){
				result.push(index);
			}
		})
		return result.join(",");
	}
	alert(sortA(a));

for in用法:

var a="2,78,5,6,87,34,65,23,5,22,67,889,3,45,78,3,453545434,323232,25656565,333334,222222222";
//用空间换时间算法
	function sortA(s){
		var ary=s.split(",");
		var temp=[];
		var result=[];
		for(var i in ary){
			if(temp[ary[i]]==undefined){
				temp[ary[i]]=1;
			}else{
				temp[ary[i]]++;
			}
			
		}
	    for(var i in temp){
			while(temp[i]-->0){
				result.push(i);
			}
		}
		
		return result.join(",");
	}

	alert(sortA(a));

for(;;)用法:

var a="2,78,5,6,87,34,65,23,5,22,67,889,3,45,78,3,453545434,323232,25656565,333334,222222222";
//用空间换时间算法
	function sortA(s){
		var ary=s.split(",");
		var temp=[];
		var result=[];
		for(var i=0;i<ary.length;i++){
			if(temp[ary[i]]==undefined){
				temp[ary[i]]=1;
			}else{
				temp[ary[i]]++;
			}
			
		}
	   for(var i=0;i<temp.length;i++){
		   if(temp[i]!=undefined){
			while(temp[i]-->0){
				result.push(i);
			}
		   }
		}
		
		return result.join(",");
	}

	alert(sortA(a));

结果 forEach和for(;;)及其慢,但最终还是会出结果,for in瞬间出结果

原因是for in遍历的时候会跳过值为undefined的数组项;for(;;)遍历了数组的所有项

对于forEach

var a=[];
a[100]=1;
a.forEach(function(item){
console.log(item);
});

控制台只输出了1;表面上来看forEach也跳过了值为undefined的数组;但是这并不表示forEach方法没有遍历所有数组项;因为forEach是数组对象的一个方法,实现此方法的代码遍历了数组的所有项,只是判断数组项的值为undefined就不做处理(处理即为执行传入函数);

用js,对于这种简单数值排序有没有更好的方法了?

当然有:

ary.sort(function(a,b){
			return Number(a)>Number(b)?1:(a==b?0:-1);
		});

哈哈 没事不要用自己写的排序,特殊情况除外,js源生的排序都是用c编写的,效率那叫一个快;

这里主要弄清下平时常用的几个循环的细微差距。

 

© 著作权归作者所有

粉丝 1
博文 13
码字总数 3450
作品 0
武汉
私信 提问
JavaScript数组(一)——排序

JavaScript数组中有一个方法,可用于反转数组,如下代码所示: 但是多数情况下这并不能满足开发的需求,真实的情况往往是降序或升序排列。对数组进行排序很自然地会想到冒泡排序算法,下面我...

Bob2100
03/17
20
0
15个必备的javascript小技巧,看的懂是入门,全会写就是大神

1、变量转换 看起来很简单,但据我所看到的,使用构造函数,像Array()或者Number()来进行变量转换是常用的做法。始终使用原始数据类型(有时也称为字面量)来转换变量,这种没有任何额外的影...

急速奔跑中的蜗牛
2018/06/06
0
0
JavaScript 数据结构与算法之美 - 栈内存与堆内存 、浅拷贝与深拷贝

女神镇楼 前言 想写好前端,先练好内功。 栈内存与堆内存 、浅拷贝与深拷贝,可以说是前端程序员的内功,要知其然,知其所以然。 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 Ja...

全栈修炼
07/02
0
0
前端开发:Javascript中的数组,常用方法解析

前端开发:Javascript中的数组,常用方法解析 前言  Array是Javascript构成的一个重要的部分,它可以用来存储字符串、对象、函数、Number,它是非常强大的。因此深入了解Array是前端必修的功...

grootzhang
2016/06/17
0
0
说说 Vue.js 中的 v-for 列表渲染指令

1 基本用法 当遍历一个数组或枚举一个对象进行迭代循环展示时,就会用到列表渲染指令 v-for。 它的表达式需要结合 in 来使用,类似 item in items 的形式。 1.1 遍历数组 html: js: 效果:...

deniro
2018/11/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

怎样在磁盘上查找MySQL表的大小?这里有答案

导读 我想知道 MySQL 表在磁盘上占用多少空间,但看起来很琐碎。不应该在 INFORMATION_SCHEMA.TABLES 中提供这些信息吗?没那么简单! 我想知道 MySQL 表在磁盘上占用多少空间,但看起来很琐碎...

问题终结者
28分钟前
6
0
jQuery load() 方法实现加载远程数据

jQuery load() 方法是简单但强大的 AJAX 方法。load() 方法从服务器加载数据,并把返回的数据放入被选元素中。 语法: $(selector).load(URL,data,callback);必需的 URL 参数规定您希望加载的...

前端老手
29分钟前
5
0
Spring Boot缓存实战 Redis 设置有效时间和自动刷新缓存-2

问题 上一篇Spring Boot Cache + redis 设置有效时间和自动刷新缓存,时间支持在配置文件中配置,说了一种时间方式,直接扩展注解的Value值,如: @Override@Cacheable(value = "people#${s...

xiaolyuh
38分钟前
9
0
怎样在磁盘上查找MySQL表的大小?这里有答案

我想知道 MySQL 表在磁盘上占用多少空间,但看起来很琐碎。不应该在 INFORMATION_SCHEMA.TABLES 中提供这些信息吗?没那么简单! 我想知道 MySQL 表在磁盘上占用多少空间,但看起来很琐碎。不应...

Linux就该这么学
今天
5
0
Redis

一、Redis支持的几种数据类型:字符串、List、SET、HASH、ZSET 二、Redis的缓存技术主要是为了降低关系数据库的负载并减少网站成本 三、在Redis里面,被MULTI命令和EXEC命令包围的所有命令会...

BobwithB
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部