之前的随笔“JavaScript中数组类型的属性和方法”中有介绍很多数组类型的方法,但都是一些理论。最近在练习在线编程题,发现自己还是习惯于用常规的循环来答题,对于数组的方法的使用还是不够熟练。这次笔记归纳了一下基础的数组编程题,意在加深对数组各种方法的印象,以便理解使用。


1.计算给定数组arr所有元素的和(number类型)

  • 常规循环

     function sum(arr) {
    var s = 0;
    for (var i=arr.length-1; i>=0; i--) {
    s += arr[i];
    }
    return s;
    }
  • forEach()遍历

     function sum(arr) {
    var s = 0;
    arr.forEach(function(val, idx, arr) {
    s += val;
    }, 0);
    return s;
    };
  • reduce()归并

     function sum(arr) {
    return arr.reduce(function(prev, curr, idx, arr){
    return prev + curr;
    });
    }
  • eval()与join()

     function sum(arr) {
    return eval(arr.join("+"));
    };

2.移除指定数组arr中所有与item相等的元素

  • 不修改arr

     //创建新数组,push()
    function remove(arr, item) {
    var result = [];
    for(var i = 0; i < arr.length; i++){
    if(arr[i] != item){
    result.push(arr[i]);
    }
    }
    return result;
    } // filter()迭代
    function remove(arr, item) {
    return arr.filter(function(x) { return x !== item; });
    }
  • 直接修改arr

     function removeWithoutCopy(arr, item) {
    for(var i = 0; i < arr.length; i++){
    if(arr[i] == item){
    arr.splice(i,1);
    i--;
    }
    }
    return arr;
    }

3.在数组arr指定位置添加元素item(不修改arr)

  • 在数组开头添加

     //****复制数组再添加(concat/slice + unshift/splice)****
    function prepend(arr, item) {
    var result = arr.concat(); //var result = arr.slice(0);
    result.unshift(item); //result.splice(0,0,item);
    return result;
    } //*****直接拼接**** //利用concat
    function prepend(arr, item) {
    return [item].concat(arr);
    } //使用push.apply
    function prepend(arr, item) {
    var newArr=[item];
    [].push.apply(newArr, arr);
    return newArr;
    }
  • 在数组末尾添加

     //普通的迭代拷贝
    var append = function(arr, item) {
    var newArr = [];
    for (var i = 0; i < arr.length; i++) {
    newArr.push(arr[i]);
    }
    newArr.push(item);
    return newArr;
    }; // 使用slice浅拷贝+push组合
    var append2 = function(arr, item) {
    var newArr = arr.slice(0); // slice(start, end)浅拷贝数组
    newArr.push(item);
    return newArr;
    }; //使用concat将传入的数组或非数组值与原数组合并,组成一个新的数组并返回
    var append3 = function(arr, item) {
    return arr.concat(item);
    };
  • 在数组index处添加

    //复制数组,在添加
    function insert(arr, item, index) {
    var newArr=arr.concat(); //var newArr=arr.slice(0);
    //var newArr=[]; [].push.apply(newArr, arr);
    newArr.splice(index,0,item);
    return newArr;
    } //利用slice+concat
    function insert(arr, item, index) {
    return arr.slice(0,index).concat(item,arr.slice(index));
    }

4.在数组arr指定位置删除元素(不修改arr)

  • 删除数组开头元素

     //复制,再删除
    function curtail(arr) {
    var newArr = arr.concat(); //var newArr = arr.join().split(',');
    //var newArr=[]; [].push.apply(newArr, arr);
    newArr.shift();
    return newArr;
    } //利用filter
    function curtail(arr) {
    return arr.filter(function(v,i) {
    return i!==0;
    });
    } //利用slice
    function curtail(arr) {
    return arr.slice(1);
    }
  • 删除数组末尾元素

     function truncate(arr) {
    return arr.slice(0,arr.length-1);
    }

5.合并数组(不修改arr)

  • 利用concat()

     function concat(arr1, arr2) {
    return arr1.concat(arr2);
    }
  • 利用 splice + push.apply

     function concat(arr1, arr2) {
    var newArr=arr1.slice(0);
    [].push.apply(newArr, arr2);
    return newArr;
    }

6.统计数组arr中元素item出现的次数

  • 常规循环

     function count(arr, item) {
    var sum = 0;
    for(var i = 0; i < arr.length; i++){
    if( arr[i] == item){
    sum ++;
    }
    }
    return sum;
    }
  • 利用filter()

    function count(arr, item) {
    return arr.filter(function(x){
    return (x==item);
    }).length
    }
  • 利用forEach()

    function count(arr, item) {
    var count = 0;
    arr.forEach(function(x) {
    x === item ? count++ : 0;
    });
    return count;
    }
  • 利用reduce()

     function count(arr, item) {
    var count = arr.reduce(function(prev, curr) {
    return curr === item ? prev+1 : prev;
    }, 0);
    return count;
    }

7.输出数组arr中重复出现过的元素

  • 双循环

     function duplicates(arr) {
    var result = [];
    for(var i=0;i<arr.length;i++){
    for(var j=i+1;j<arr.length;j++){
    if(arr[i]==arr[j]){
    result.push(arr[i]);
    arr.splice(i,1);
    arr.splice(j,1);
    i=i-2;
    j=j-2;
    }
    }
    }
    return result;
    }
  • 先排序,再循环

     function duplicates(arr) {
    var copy = arr.sort(),
    result = [];
    for(var i in copy){
    if(copy[i]==copy[i-1] && result.indexOf(copy[i])==-1) result.push(copy[i]);
    }
    return result;
    }
  • 利用forEach()

     function duplicates(arr) {
    var result = [];
    arr.forEach(function(elem){
    if(arr.indexOf(elem) != arr.lastIndexOf(elem) && result.indexOf(elem) == -1){
    result.push(elem);
    }
    });
    return result;
    }

8.数组去重

 Array.prototype.uniq = function () {
var flag = false;
for(var i = 0; i < this.length; i++){
if(this[i] !== this[i]) flag = true;
for(var j = i+1; j < this.length;){
if(this[i] === this[j] ||(flag && this[j] !== this[j])){
this.splice(j,1);
}else{
j++;
}
}
}
return this;
}

JavaScript数组基础编程题归纳的更多相关文章

  1. #学习笔记#——JavaScript 数组部分编程(一)

    来自牛客网的js编程题 1.移除数组 arr 中的所有值与 item 相等的元素.不要直接修改数组 arr,结果返回新的数组 function remove(arr, item) { if(!Arra ...

  2. java基础编程题练习(一)

    1.编程实现用户输入4个整数,按从大到小的顺序排列输出. 思路:将输入的数据存入数组,使用冒泡排序对数组数据进行排序后输出数组 冒泡排序的代码如下: import java.util.Scanner; ...

  3. 《ACM国际大学生程序设计竞赛题解Ⅰ》——基础编程题

    这个专栏开始介绍一些<ACM国际大学生程序设计竞赛题解>上的竞赛题目,读者可以配合zju/poj/uva的在线测评系统提交代码(今天zoj貌似崩了). 其实看书名也能看出来这本书的思路,就 ...

  4. java面向对象基础编程题

    第一题: 设计一个形状类Shape,方法:求周长和求面积.形状类的子类:Rect(矩形),Circle(圆形).Rect类的子类:Square(正方形).不同的子类会有不同的计算周长和面积的方法1.总 ...

  5. #学习笔记#——JavaScript 数组部分编程(七)

    24.柯里化 首先想解释一下,“柯里化”的意思, [在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结 ...

  6. java基础编程题(1)

    1. 题目:打印出杨辉三角形(要求打印出10行如下图) 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1...... package com.jzq.test1; ...

  7. PAT 基础编程题 4-11 求自定类型元素序列的中位数(希尔排序)

    4-11 求自定类型元素序列的中位数   (25分) 本题要求实现一个函数,求N个集合元素A[]的中位数,即序列中第\lfloor N/2 +1\rfloor⌊N/2+1⌋大的元素.其中集合元素的类型 ...

  8. JavaScript数组基础及实例

    js数组 和var i=1;这样的简单存储一样是js中的一种数据结构,是专门用来存储多个数据的一种数据结构. 摘:数组是一组数据的集合,其表现形式就是内存中的一段连续的内存地址,数组名称其实就是连续内 ...

  9. JavaScript 数组基础知识

    // Array 类型: // 检测数组: // console.log(myarr instanceof Array) //true // toString()方法会返回由数组中每个值的字符串形式拼 ...

随机推荐

  1. jQuery给CheckBox全选与不全选

    $(function(){ $("#checkAll").click(function() {//全选 $('input[name="DATA"]').prop ...

  2. Tomcat使用Memcached Session Manager管理Session

    Tomcat使用Memcached Session Manager管理Session 废话不多说,直接进入主题.项目使用阿里云负载均衡+ECS服务器集群进行部署,Tomcat使用8.5版本.阿里云负载 ...

  3. Eclipse通过jdbc连接数据库制作简单登陆界面

    一.前言: 做网站开发,要求有多种搭配方式,前台技术可以使用PHP.ASP.JSP.ASP.NET.CGI等任何一种: 需要用到的基础语言用的最多的就是HTML/CSS.JS.JAVA.XML这些了, ...

  4. 用JS获取地址栏中的参数的简易方法

    这个方法用起来超级简单,传入参数即可直接获取地址栏中的参数 代码如下 function GetQueryString(name) { var reg = new RegExp("(^|&am ...

  5. 关于开发中使用writeToFile时的注意事项

    总会有一些坑在前面等着你 我们先来看一下后台返回的部分json数据,稍后再来分析问题,仔细看一下userId和userCode两个字段,其他不用看 "list": [{ " ...

  6. 如何快速的学习selenium工具

    分享即快乐. 最近几年,软件测试工程师一度成为热门职业,作为测试员也是倍感压力.作为测试员来说,仅仅会手工测试让职业生涯陷入瓶颈.于是工作之余充电,学习了自动化测试工具selenium,打算进阶中高级 ...

  7. 【2017-03-10】Tsql语句基础、条件,高级查询

    一.语句基础 1.创建数据库:create database 数据库名(不能汉字,不能数字.符号开头) 2.删除数据库:drop database 数据库名 3.选用数据库:use 数据库名 4.创建 ...

  8. ASP日期格式化函数

    Public Function GetFormatDate(DateAndTime, para)On Error Resume NextDim y, m, d, h, mi, s, strDateTi ...

  9. 算法模板——平衡树Treap

    实现功能如下——1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数,因输出最小的排名)4. 查询排名为x的数5. 求x的前驱(前驱定义为小于x,且最大 ...

  10. UINavigationBar统一修改导航条样式

    #pragma mark -- 统一导航条样式 //统一导航条样式 UIFont *font = [UIFont systemFontOfSize:19.f]; NSDictionary *textA ...