javascript常用数组算法总结
1、数组去重
方法1:
function unique (arr) {
var result = [];
for (var i = 0; i < arr.length; i++)
{
if (result.indexOf(arr[i]) == -1) result.push(arr[i]);
}
return result;
}
1
2
3
4
5
6
7
8
9
|
//利用数组的indexOf方法
function unique (arr) {
var result = [];
for (var i = 0; i < arr.length; i++)
{
if (result.indexOf(arr[i]) == -1) result.push(arr[i]);
}
return result;
}
|
方法2:
function unique (arr)
{
var hash = {},result = [];
for(var i = 0; i < arr.length; i++)
{
if (!hash[arr[i]])
{
hash[arr[i]] = true;
result.push(arr[i]);
}
}
return result;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
//利用hash表,可能会出现字符串和数字一样的话出错,如var a = [1, 2, 3, 4, '3', 5],会返回[1, 2, 3, 4, 5]
function unique (arr)
{
var hash = {},result = [];
for(var i = 0; i < arr.length; i++)
{
if (!hash[arr[i]])
{
hash[arr[i]] = true;
result.push(arr[i]);
}
}
return result;
}
|
方法3:
function unique (arr) {
arr.sort();
var result=[arr[0]];
for(var i = 1; i < arr.length; i++){
if( arr[i] !== arr[i-1]) {
result.push(arr[i]);
}
}
return result;
}
1
2
3
4
5
6
7
8
9
10
11
|
//排序后比较相邻,如果一样则放弃,否则加入到result。会出现与方法2一样的问题,如果数组中存在1,1,'1'这样的情况,则会排错
function unique (arr) {
arr.sort();
var result=[arr[0]];
for(var i = 1; i < arr.length; i++){
if( arr[i] !== arr[i-1]) {
result.push(arr[i]);
}
}
return result;
}
|
方法4:
function unique (arr) {
if(arr.length == 0) return;
var result = [arr[0]], isRepeate;
for( var i = 0, j = arr.length; i < j; i++ ){
isRepeate = false;
for( var k = 0, h = result.length; k < h; k++){
if(result[k] === arr[i]){
isRepeate = true;
break;
}
if(k == h) break;
}
if( !isRepeate ) result.push(arr[i]);
}
return result;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
//最简单但是效率最低的算法,也不会出现方法2和方法3出现的bug
function unique (arr) {
if(arr.length == 0) return;
var result = [arr[0]], isRepeate;
for( var i = 0, j = arr.length; i < j; i++ ){
isRepeate = false;
for( var k = 0, h = result.length; k < h; k++){
if(result[k] === arr[i]){
isRepeate = true;
break;
}
if(k == h) break;
}
if( !isRepeate ) result.push(arr[i]);
}
return result;
}
|
2、数组顺序扰乱
方法1:
function shuffle(array) {
var copy = [],
n = array.length,
i;
// 如果还剩有元素则继续。。。
while (n) {
// 随机抽取一个元素
i = Math.floor(Math.random() * array.length);
// 如果这个元素之前没有被选中过。。
if (i in array) {
copy.push(array[i]);
delete array[i];
n--;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
//每次随机抽一个数并移动到新数组中
function shuffle(array) {
var copy = [],
n = array.length,
i;
// 如果还剩有元素则继续。。。
while (n) {
// 随机抽取一个元素
i = Math.floor(Math.random() * array.length);
// 如果这个元素之前没有被选中过。。
if (i in array) {
copy.push(array[i]);
delete array[i];
n--;
}
}
|
方法2:
function shuffle(array) {
var copy = [],
n = array.length,
i;
// 如果还剩有元素。。
while (n) {
// 随机选取一个元素
i = Math.floor(Math.random() * n--);
// 移动到新数组中
copy.push(array.splice(i, 1)[0]);
}
return copy;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
//跟方法1类似,只不过通过splice来去掉原数组已选项
function shuffle(array) {
var copy = [],
n = array.length,
i;
// 如果还剩有元素。。
while (n) {
// 随机选取一个元素
i = Math.floor(Math.random() * n--);
// 移动到新数组中
copy.push(array.splice(i, 1)[0]);
}
return copy;
}
|
方法3:
function shuffle(array) {
var m = array.length,
t, i;
// 如果还剩有元素…
while (m) {
// 随机选取一个元素…
i = Math.floor(Math.random() * m--);
// 与当前元素进行交换
t = array[m];
array[m] = array[i];
array[i] = t;
}
return array;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
//前面随机抽数依次跟末尾的数交换,后面依次前移,即:第一次前n个数随机抽一个跟第n个交换,第二次前n-1个数跟第n-1个交换,依次类推。
function shuffle(array) {
var m = array.length,
t, i;
// 如果还剩有元素…
while (m) {
// 随机选取一个元素…
i = Math.floor(Math.random() * m--);
// 与当前元素进行交换
t = array[m];
array[m] = array[i];
array[i] = t;
}
return array;
}
|
3、数组判断
方法1:
var array6 = [];
Array.isArray(array6 );//true
1
2
3
|
//自带的isArray方法
var array6 = [];
Array.isArray(array6 );//true
|
方法2:
var array5 = [];
array5 instanceof Array;//true
1
2
3
|
//利用instanceof运算符
var array5 = [];
array5 instanceof Array;//true
|
方法3:
function isArray(o) {
return Object.prototype.toString.call(o) === ‘[object Array]‘;
}
1
2
3
4
|
//利用toString的返回值
function isArray(o) {
return Object.prototype.toString.call(o) === ‘[object Array]‘;
}
|
4、数组求交集
方法1:
array1.filter(function(n) {
return array2.indexOf(n) != -1
});
1
2
3
4
|
//利用filter和数组自带的indexOf方法
array1.filter(function(n) {
return array2.indexOf(n) != -1
});
|
5、数组求并集
方法1:
function arrayUnique(array) {
var a = array.concat();
for(var i=0; i<a.length; ++i) {
for(var j=i+1; j<a.length; ++j) {
if(a[i] === a[j])
a.splice(j--, 1);
}
}
return a;
};
1
2
3
4
5
6
7
8
9
10
11
12
|
//方法原理:连接两个数组并去重
function arrayUnique(array) {
var a = array.concat();
for(var i=0; i<a.length; ++i) {
for(var j=i+1; j<a.length; ++j) {
if(a[i] === a[j])
a.splice(j--, 1);
}
}
return a;
};
|
6、数组求差集
方法1:
Array.prototype.diff = function(a) {
return this.filter(function(i) {return a.indexOf(i) < 0;});
};
1
2
3
4
|
//利用filter和indexOf方法
Array.prototype.diff = function(a) {
return this.filter(function(i) {return a.indexOf(i) < 0;});
};
|
暂时汇总了这点儿,有待后续补充。欢迎大家补充。
javascript常用数组算法总结的更多相关文章
- javascript常用经典算法实例详解
javascript常用经典算法实例详解 这篇文章主要介绍了javascript常用算法,结合实例形式较为详细的分析总结了JavaScript中常见的各种排序算法以及堆.栈.链表等数据结构的相关实现与 ...
- javascript常用排序算法实现
毕业后,由于工作中很少需要自已去写一些排序,所以那些排序算法都忘得差不多了,不过排序是最基础的算法,还是不能落下啦,于是找了一些资料,然后用Javascript实现了一些常用的算法,具体代码如下: & ...
- 技巧收藏|10个JavaScript常用数组操作方法
摘要:这篇文章,向大家展示了在日常开发中,数组有哪些小技巧值得借鉴和学习. 在web前端开发第二阶段Javascript中,数组是一个重要且常见的知识点,我们经常将数据存储在数组中,遍历数组或替换数组 ...
- javascript常用排序算法总结
算法是程序的灵魂.虽然在前端的开发环境中排序算法不是很经常用到,但常见的排序算法还是应该要掌握的.我在这里从网上整理了一下常见排序算法的javascript实现,方便以后查阅. 归并排序: 1 fun ...
- JavaScript常用数组操作方法
数组是用于储存多个相同类型数据的集合,平时在数据的处理中用到最多,JavaScript 中常用的操作方法 1.concat()concat() 方法用于连接两个或多个数组.该方法不会改变现有的数组,仅 ...
- JavaScript常用数组方法
JavaScript数组方法有以下这些: forEach() 方法对数组的每一个元素执行一次提供的函数. map() 方法创建一个新数组,其结果是该数组都执行一次函数,原函数保持不变. filter( ...
- JavaScript常用数组操作方法,包含ES6方法
一.concat() concat() 方法用于连接两个或多个数组.该方法不会改变现有的数组,仅会返回被连接数组的一个副本. var arr1 = [1,2,3]; var arr2 = [4,5]; ...
- JavaScript常用数组操作方法,包含ES6方法
一.concat() concat() 方法用于连接两个或多个数组.该方法不会改变现有的数组,仅会返回被连接数组的一个副本. var arr1 = [1,2,3]; var arr2 = [4,5]; ...
- JavaScript 常用数组函数方法专题
1. 由字符串生成数组 split() 分割字符串,并将分割的部分作为一个元素保存在一个新建的数组中. var str1 = "this is an emample to using the ...
随机推荐
- 二:基础概述netty
如果不了解netty的,可以百度下,netty社区现在也比较活跃. 现在所谓的大数据,flume,storm等底层都是netty. netty的性能模型: io模型---->异步非阻塞io ...
- C#读写config配置文件
应用程序配置文件(App.config)是标准的 XML 文件,XML 标记和属性是区分大小写的.它是可以按需要更改的,开发人员可以使用配置文件来更改设置,而不必重编译应用程序. 对于一个config ...
- supervisor centos安装
一.安装配置supervisor 1.安装python自动化工具 #yum install python-setuptools 2.#easy_install supervisor安装super ...
- 如何用python搞定验证码中的噪点
背景:朋友在为"关山口男子职业技术学校"写一款校园应用,于是找MoonXue写一个学生选课系统的登录接口.为了搞定这个接口,不得不先搞定这个系统的验证码. 验证码大概是这个样子 看 ...
- nginx 目录文件列表功能配置
工作中常常有写不能有网页下载东西的需求,在Apache下搭建完成后直接导入文件即可达到下载/显示文件的效果,而Nginx也可以满足这样的需求(nginx 目录列表功能默认是关闭的),这时就需要配置. ...
- C++软件添加dump调试打印日志
#include <DbgHelp.h> #pragma comment(lib, "dbghelp.lib") LONG WINAPI TopLevelExcepti ...
- 【1】springmvc4 + servlet3 零配置全注解入门项目helloword
自从servlet3.0支持注解,使得javaweb项目使用全注解成为可能. 注解化将成为javaweb的发展方向.包括spring去年推出的spring-boot也是全部使用注解. 代码:https ...
- 一步一步搭框架(asp.netmvc+easyui+sqlserver)-02
一步一步搭框架(asp.netmvc+easyui+sqlserver)-02 我们期望简洁带前台代码,如下: <table id="dataGrid" class=&quo ...
- 快速了解IOC的几种姿势
一.首先我们了解IOC如何注入的几种姿势 构造函数注入(Constructor Injection) Ioc容器会智能的选择和调用合适的构造函数以创建依赖的对象.如果被选择的构造函数具有相应的参数,I ...
- Spark源码学习1.8——ShuffleBlockManager.scala
shuffleBlockManager继承于Logging,参数为blockManager和shuffleManager.shuffle文件有三个特性:shuffleId,整个shuffle stag ...