之前的随笔“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. 【openstack N版】——创建云主机

    一.启动实例 1.1 已准备服务介绍 MySql:为各个服务提供数据存储. RabbitMQ:为各个服务之间通信提供交通枢纽. keystone:为各个服务之间通信提供认证和服务注册. Glance: ...

  2. MD5算法学习整理

    一路学来 记得笔记不少 但是给自己看 当时就记得很随意 以为后面都懂 但还是太单纯了,现在回顾 自己都完全看不下去,所以以后的都放的博客上,让自己看懂,让感兴趣的看懂,详细,暴力 不废话了 MD5算法 ...

  3. php 实现简单购物车

    今天在练习购物车以及提交订单,写的有点头晕,顺便也整理一下,这个购物车相对来说比较简单,用于短暂存储,并没有存储到数据库, 购物车对于爱网购的人来说简直是熟悉的不能再熟悉了,在写购物车之前,我们首先要 ...

  4. 信号处理——Hilbert端点效应浅析

    作者:桂. 时间:2017-03-05  19:29:12 链接:http://www.cnblogs.com/xingshansi/p/6506405.html 声明:转载请注明出处,谢谢. 前言 ...

  5. Visual Studio 20周年,我和VS不得不说的故事(内含福利)

    Visual Studio 2017正式版已如期发布(点击这里查看发布全记录)!自去年 11 月正式宣布 Visual Studio 项目之后,微软终于正式推出了“宇宙最强集成开发环境(IDE)”的最 ...

  6. CCF2013123最大的矩形(C语言版)

    问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ i ≤ n)个矩形的高度是hi.这n个矩形构成了一个直方图.例如,下图中六个矩形的高度就分别是3, 1, 6, 5, 2, 3 ...

  7. RequireJS基础知识

    RequireJS解决代码依赖问题,异步加载js,避免页面失去相应 RequireJS的目标是鼓励代码的模块化,它使用了不同于传统<script>标签的脚本加载步骤.可以用它来加速.优化代 ...

  8. 计算机程序的思维逻辑 (75) - 并发容器 - 基于SkipList的Map和Set

    上节我们介绍了ConcurrentHashMap,ConcurrentHashMap不能排序,容器类中可以排序的Map和Set是TreeMap和TreeSet,但它们不是线程安全的.Java并发包中与 ...

  9. python常见的特异点

    编码问题 Python中默认的编码格式是 ASCII 格式,在没修改编码格式时无法正确打印汉字,所以在读取中文时会报错.解决方法为只要在文件开头加入 # -*- coding: UTF-8 -*- 或 ...

  10. Cesium原理篇:3D Tiles(3)个人总结

    个人结论:目前,在演示层面,3D Tiles问题不大,但项目应用上就不够成熟了,所以问问自己,你是想吃瓜呢还是想吃螃蟹? 好的方面 数据规范 我非常喜欢glTF的整体设计,概括有四点:第一,数据块(B ...