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 ...
随机推荐
- java selenium (一) selenium 介绍
Selenium 是目前用的最广泛的Web UI 自动化测试框架. 本系列文章,将深入简出来讲解selenium 的用法 文章的末尾处, 有整个系列的链接 阅读目录 selenium 的命名 sele ...
- Jquery基础之DOM操作
转自:http://www.cnblogs.com/bro-ma/p/3063942.html JQuery中的DOM操作主要对包括:建[新建].增[添加].删[删除].改[修改].查[查找][像数据 ...
- asp.net ajax控件tab扩展,极品啊,秒杀其它插件
说明:asp.net ajax控件tab要设置width和height,而且在线文本编辑器放能够放入tab中,也必须是asp.net的控件型在线文本,例如fckeditor,下面是我设置好的配置. & ...
- Fortran版MPI_barrier出现错误可能情况
在Fortran中的MPI_开头函数都常有一个整数型的错误变量用以函数返回错误信息.如: call MPI_Barrier(MPI_COMM_WORLD,ierr) 在没有ierr参数时,程序可能会出 ...
- 【Python③】python基本数据类型,变量和常量
基本数据类型 Python中,能直接处理的数据类型有以下几种: 整数 Python可以处理任意大小的整数,包括负整数,程序中的写法和数学上的一样,例如:6,-666,8888…… 计算机使用二进制,所 ...
- petset翻译
Terminology 通过这个文档,你将会看到一些术语,有时候他们在别的地方交叉使用,这可能会引起一些困惑.这一节的 是帮助你理清楚他们. Node: 一个简单的虚拟或物理机在你的一个k ...
- Java基础&笔试题
这些题目是近期我参加过的笔试题和一些我在网上选的部分题,在这里做笔记,认真去学习,更好的应对后面的招聘.有错误欢迎指出. 一.Java基础部分 1.指针在任何情况下都可进行>,<,> ...
- 关于win10系统自带浏览器IE11的JQuery使用问题
<!DOCTYPE html> <html> <head lang="en"> <meta charset="utf-8&quo ...
- DotNetBar for Windows Forms 11.8.0.8冰河之刃重打包版
关于 DotNetBar for Windows Forms 11.8.0.8_冰河之刃重打包版 基于 官方原版的安装包 + http://www.cnblogs.com/tracky 提供的补丁DL ...
- Buffer、Channel示例
a.txt 孔雀向西飞,今朝更好看.孔雀向西飞,今朝更好看.孔雀向西飞,今朝更好看.孔雀向西飞,今朝更好看. 示例一. package com.test; import java.io.FileI ...