1、数组去重


方法1:

JavaScript
//利用数组的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;
}
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:

JavaScript
//利用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;
}
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:

JavaScript
//排序后比较相邻,如果一样则放弃,否则加入到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;
}
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:

JavaScript
//最简单但是效率最低的算法,也不会出现方法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;
}
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:

JavaScript
//每次随机抽一个数并移动到新数组中
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:

JavaScript
//跟方法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;
}
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:

JavaScript
//前面随机抽数依次跟末尾的数交换,后面依次前移,即:第一次前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;
}
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:

JavaScript
//自带的isArray方法
var array6 = [];
Array.isArray(array6 );//true
1
2
3
//自带的isArray方法
var array6 = [];
Array.isArray(array6 );//true

方法2:

JavaScript
//利用instanceof运算符
var array5 = [];
array5 instanceof Array;//true
1
2
3
//利用instanceof运算符
var array5 = [];
array5 instanceof Array;//true

方法3:

JavaScript
//利用toString的返回值
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:

JavaScript
//利用filter和数组自带的indexOf方法
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:

JavaScript
//方法原理:连接两个数组并去重
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:

JavaScript
//利用filter和indexOf方法
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常用数组算法总结的更多相关文章

  1. javascript常用经典算法实例详解

    javascript常用经典算法实例详解 这篇文章主要介绍了javascript常用算法,结合实例形式较为详细的分析总结了JavaScript中常见的各种排序算法以及堆.栈.链表等数据结构的相关实现与 ...

  2. javascript常用排序算法实现

    毕业后,由于工作中很少需要自已去写一些排序,所以那些排序算法都忘得差不多了,不过排序是最基础的算法,还是不能落下啦,于是找了一些资料,然后用Javascript实现了一些常用的算法,具体代码如下: & ...

  3. 技巧收藏|10个JavaScript常用数组操作方法

    摘要:这篇文章,向大家展示了在日常开发中,数组有哪些小技巧值得借鉴和学习. 在web前端开发第二阶段Javascript中,数组是一个重要且常见的知识点,我们经常将数据存储在数组中,遍历数组或替换数组 ...

  4. javascript常用排序算法总结

    算法是程序的灵魂.虽然在前端的开发环境中排序算法不是很经常用到,但常见的排序算法还是应该要掌握的.我在这里从网上整理了一下常见排序算法的javascript实现,方便以后查阅. 归并排序: 1 fun ...

  5. JavaScript常用数组操作方法

    数组是用于储存多个相同类型数据的集合,平时在数据的处理中用到最多,JavaScript 中常用的操作方法 1.concat()concat() 方法用于连接两个或多个数组.该方法不会改变现有的数组,仅 ...

  6. JavaScript常用数组方法

    JavaScript数组方法有以下这些: forEach() 方法对数组的每一个元素执行一次提供的函数. map() 方法创建一个新数组,其结果是该数组都执行一次函数,原函数保持不变. filter( ...

  7. JavaScript常用数组操作方法,包含ES6方法

    一.concat() concat() 方法用于连接两个或多个数组.该方法不会改变现有的数组,仅会返回被连接数组的一个副本. var arr1 = [1,2,3]; var arr2 = [4,5]; ...

  8. JavaScript常用数组操作方法,包含ES6方法

    一.concat() concat() 方法用于连接两个或多个数组.该方法不会改变现有的数组,仅会返回被连接数组的一个副本. var arr1 = [1,2,3]; var arr2 = [4,5]; ...

  9. JavaScript 常用数组函数方法专题

    1. 由字符串生成数组 split() 分割字符串,并将分割的部分作为一个元素保存在一个新建的数组中. var str1 = "this is an emample to using the ...

随机推荐

  1. 二:基础概述netty

    如果不了解netty的,可以百度下,netty社区现在也比较活跃. 现在所谓的大数据,flume,storm等底层都是netty.   netty的性能模型: io模型---->异步非阻塞io ...

  2. C#读写config配置文件

    应用程序配置文件(App.config)是标准的 XML 文件,XML 标记和属性是区分大小写的.它是可以按需要更改的,开发人员可以使用配置文件来更改设置,而不必重编译应用程序. 对于一个config ...

  3. supervisor centos安装

    一.安装配置supervisor 1.安装python自动化工具    #yum install python-setuptools 2.#easy_install supervisor安装super ...

  4. 如何用python搞定验证码中的噪点

    背景:朋友在为"关山口男子职业技术学校"写一款校园应用,于是找MoonXue写一个学生选课系统的登录接口.为了搞定这个接口,不得不先搞定这个系统的验证码. 验证码大概是这个样子 看 ...

  5. nginx 目录文件列表功能配置

    工作中常常有写不能有网页下载东西的需求,在Apache下搭建完成后直接导入文件即可达到下载/显示文件的效果,而Nginx也可以满足这样的需求(nginx 目录列表功能默认是关闭的),这时就需要配置. ...

  6. C++软件添加dump调试打印日志

    #include <DbgHelp.h> #pragma comment(lib, "dbghelp.lib") LONG WINAPI TopLevelExcepti ...

  7. 【1】springmvc4 + servlet3 零配置全注解入门项目helloword

    自从servlet3.0支持注解,使得javaweb项目使用全注解成为可能. 注解化将成为javaweb的发展方向.包括spring去年推出的spring-boot也是全部使用注解. 代码:https ...

  8. 一步一步搭框架(asp.netmvc+easyui+sqlserver)-02

    一步一步搭框架(asp.netmvc+easyui+sqlserver)-02 我们期望简洁带前台代码,如下: <table id="dataGrid" class=&quo ...

  9. 快速了解IOC的几种姿势

    一.首先我们了解IOC如何注入的几种姿势 构造函数注入(Constructor Injection) Ioc容器会智能的选择和调用合适的构造函数以创建依赖的对象.如果被选择的构造函数具有相应的参数,I ...

  10. Spark源码学习1.8——ShuffleBlockManager.scala

    shuffleBlockManager继承于Logging,参数为blockManager和shuffleManager.shuffle文件有三个特性:shuffleId,整个shuffle stag ...