JavaScript数组和循环详解

数组是元素的一个有序组合。在JavaScript中,数组可以使用正式的对象表示法来创建,或者可以使用直接量表示法来初始化。

代码如下:

var arrObject = new Array("val1", "val2"); // 作为对象的数组
var arrLiteral = ["val1", "val2"]; // 数组直接量

  对于开发者来说,这没有区别:在直接量和对象上都可以调用一个Array方法。对于JavaScript引擎来说,每次访问数组直接量的时候,必须重新解释它,特别是在一个函数中使用它的时候。

  使用new运算符来创建一个新的Array对象:

代码如下:

var arrObject = new Array();

  也可以创建带有某些值的一个新数组:

代码如下:

var arrObject = new Array("val1", "val2");

  JavaScript中的数组是从0开始索引的,这意味着,第一个元素的索引是0,最后一个元素是数组的长度减去1。

1、循环遍历数组

  问题:想要很容易地访问数组的所有元素。

  解决方案:

  要访问一个数组,最常用的方法是使用for循环:

代码如下:

<script type="text/javascript">
    var animals = new Array("cat", "dog", "whale", "seal");
    var animalString = "";
    for (var i = 0; i < animals.length - 1; i++) {
        animalString += animals[i] + " ";
    }
    alert(animalString);
</script>

 讨论:

  for循环可以用来访问数组的每一个元素。数组从0开始,而且数组属性length用来设定循环结束。

2、按顺序存储和访问值

  问题:想要以这样一种方式来存储值,可以按照存储它们的方式来顺序访问值;

  解决方案:

  要按照接受值的顺序来存储和访问值,创建一个先进先出(FIFO)的队列。使用JavaScript Array对象的push方法,向队列添加项,并且用shift来获取项:

代码如下:

<script type="text/javascript">
    // 创建新的数组
    var queue = new Array();

// 压入3个条目
    queue.push("first");
    queue.push("second");
    queue.push("third");

// 获取两个条目
    alert(queue.shift());
    alert(queue.shift());
    alert(queue);
</script>

讨论:

  Array push方法创建一个新的数组元素,并且将其添加到数组的末尾:

代码如下:

queue.push("first");

  每次压入一个元素,数组元素的计数自增。

  Array shift方法从数组前面提取数组元素,将其从数组中删除,并且返回该元素:

代码如下:

var elem = queue.shift();

  对于每一个shift操作的元素,数组元素会自减,因为shift除了返回该项,还会修改数组。

3、以相反的顺序存储和访问值

  问题:想要以一种方式来存储值,即以相反的顺序访问值,先访问最近存储的值,也就是一个后进先出(LIFO)的栈。

  解决方案:

  要以相反的顺序存储值,创建一个LIFO栈。使用JavaScript Array对象的push方法来想栈添加项,使用pop方法来获取项:

代码如下:

<script type="text/javascript">
    // 创建新的数组
    var stack = new Array();

// 压入3个条目
    stack.push("first");
    stack.push("second");
    stack.push("third");

// 弹出两个条目
    alert(stack.pop()); // 返回第三个条目
    alert(stack.pop()); // 返回第二个条目
    alert(stack); // 返回第一个条目
</script>

讨论:

  栈也是一个数组,其中每个新添加的元素位于栈的顶部,并且按照后进先出的顺序获取。

  Array push方法创建一个新的元素,并将其添加到数组的尾部:

代码如下:

stack.push("first");

每次压入元素的时候,数组元素的计数都会自增。

  Array pop方法从数组的尾部提取数组元素,将其从数组中移走,并返回元素:

代码如下:

var elem = stack.pop();

每次弹出一个元素的时候,数组元素计数会自减,因为弹出也修改了数组。

4、在数组中搜索

  问题:想要在数组中搜索一个特定值,如果找到的话,获取该数组元素的索引。

  解决方案:

  使用新的(ECMAScript 5)Array对象方法indeOf和lastIndexOf:

代码如下:

<script type="text/javascript">
    var animals = new Array("dog", "cat", "seal", "elephant", "lion");
    alert(animals.indexOf("elephant")); // 打印出 3
    alert(animals.indexOf("seal", 2)); // 打印出 2
</script>

尽管浏览器中有时候对indexOf和lastIndexOf都是支持的,但是,这只是ECMAScript 5的版本中正式化了。这两个方法都接受一个搜索值,然后,将其与数组中的每个元素比较。如果找到了该值,两个方法都返回该数组元素的一个索引。如果没有找到值,返回-1.indexOf返回找到的第一个元素,lastIndexOf返回找到的最后一个元素。

  参见:

  并非所有的浏览器都支持indexOf和lastindexOf,针对这一函数的解决方案:

代码如下:

<script type="text/javascript">
    if (!Array.prototype.indexOf) {
        Array.prototype.indexOf = function (elt/*, from*/) {
            var len = this.length >>> 0;
            var from = Number(arguments[1]) || 0;
            from = (from < 0) ? Math.ceil(from) : Math.floor(from);

if (from < 0) {
                from += len;
            }

for (; from < len; from++) {
                if (from in this && this[from] === elt) {
                    return from;
                }
            }

return -1;
        }
    }
</script>

 5、对每个数字元素应用一个函数

  问题:想要使用一个函数来检查一个数组值,如果满足给定的条件,就替换它。

  解决方案:

  使用新的ECMAScript 5 Array对象的forEach方法,来针对每个数组元素都绑定一个回调函数:

代码如下:

<script type="text/javascript">
    function replaceElement(element, index, array) {
        if (element == "ab") {
            array[index] = "**";
        }
    }

var charSets = new Array("ab", "bb", "cd", "ab", "cc", "ab", "dd", "ab");
    //对每个数组元素应用函数
    charSets.forEach(replaceElement)
    alert(charSets); // 打印出**,bb,cd,**,cc,**,dd,**
</script>

讨论:

  forEach方法接受一个参数,这个参数是个函数。该函数自身有3个参数:数组元素,元素的索引和数组。

  参见:

  大多数浏览器都支持forEach。然而,对于那些不支持的浏览器,可以使用Array.prototype属性来模拟forEach行为。

代码如下:

<script type="text/javascript">
    if (!Array.prototype.forEach) {
        Array.prototype.forEach = function (fun/*, thisp*/) {
            var len = this.length >>> 0;
            if (typeof fun != "function") {
                throw new TypeError();
            }

var thisp = arguments[1];
            for (var i = 0; i < len; i++) {
                if (i in this) {
                    fun.call(thisp, this[i], i, this);
                }
            }
        };
    }
</script>

6、创建一个过滤后的数组

  问题:想要过滤一个数组中的元素的值,并且把结果赋给一个新的数组。

  解决方案:

  使用Array对象的filter方法:

代码如下:

<script type="text/javascript">
    function removeChars(element, index, array) {
        return element !== "**";
    }
    var charSets = new Array("**", "bb", "cd", "**", "cc", "**", "dd", "**");
    var newArray = charSets.filter(removeChars);
    alert(newArray); // bb,cd,cc,dd
</script>

讨论:

  filter方法是ECMAScript 5新添加的方法,该方法将一个回调函数应用于每一个数组元素。作为参数传递给filter方法的函数返回一个布尔值,true或false,根据测试数组元素的结果来返回。这个返回值决定了该数组元素是否添加到一个新的数组中,如果函数返回true,将会添加;否则,将不会添加。

  参见:

  对于不支持filter方法的浏览器的模拟实现:

代码如下:

<script type="text/javascript">
    if (!Array.prototype.filter) {
        Array.prototype.filter = function (fun/*, thisp*/) {
            var len = this.length >>> 0;
            if (typeof fun != "function") {
                throw new TypeError();
            }

var res = new Array();
            var thisp = arguments[1];
            for (var i = 0; i < len; i++) {
                if (i in this) {
                    var val = this[i]; // 放置fun修改了this
                    if (fun.call(thisp, val, i, this)) {
                        res.push(val);
                    }
                }
            }

return res;
        };
    }
</script>

7、验证数组内容

  问题:想要确保一个数组满足某个条件。

  解决方案:

  使用Array对象的every方法来检查给定条件的每个元素。

代码如下:

<script type="text/javascript">
    function testValue(element, index, array) {
        var re = /^[a-zA-Z]+$/;
        return re.test(element);
    }
    var elemSet = new Array("**", 123, "abc", "-", "AAA");
    alert(elemSet.every(testValue));
</script>

  讨论:

  Array对象的every和some方法都是最新的ECMAScript 5 Array方法,不同之处在于当使用every方法的时候,只要该函数返回一个false值,处理就会结束,并且该方法返回false。而some方法将继续测试每一个数组元素,知道回调函数返回true。此时不再验证其他的元素,该方法返回true。如果回调函数测试了所有的元素,并且任何时候不会返回true,some方法返回false。

  参见:

  对于不支持every和some的浏览器的实现方式:

代码如下:

<script type="text/javascript">
    if (!Array.prototype.some) {
        Array.prototype.some = function (fun/*, thisp*/) {
            var i = 0,
                len = this.length >>> 0;
            if (typeof fun != "function") {
                throw new TypeError();
            }

var thisp = arguments[1];
            for (; i < len; i++) {
                if (i in this
                    && fun.call(thisp, val, i, this)) {
                    return true
                }
            }

return false;
        };
    }

if (!Array.prototype.every) {
        Array.prototype.every = function (fun/*, thisp*/) {
            var len = this.length >>> 0;
            if (typeof fun != "function") {
                throw new TypeError();
            }

var thisp = arguments[1];
            for (var i=0; i < len; i++) {
                if (i in this
                    && fun.call(thisp, val, i, this)) {
                    return false
                }
            }

return true;
        };
    }
</script>

(0)

相关推荐

  • JavaScript 数组循环引起的思考

    看代码,不说话: 复制代码 代码如下: var i=arr.length; while(i--) { //写点啥? } 上面是Google array.js 程序中建议改进的代码.思考为什么i-- 到了 i为0时while循环结束了? 下面的代码与它等价: 复制代码 代码如下: var i=arr.length; for(;i--;) { //i--写在两个分号的中间,奇怪吗?不奇怪吗? } 震撼?没感觉? 呃.平时我们写在两个分号中间的是什么?这个i--按"常理"应该是在第二个分号之

  • js数组循环遍历数组内所有元素的方法

    例,for(){}遍历数组 复制代码 代码如下: <script type="text/javascript"> <!--var arr = new Array(13.5,3,4,5,6);for(var i=0;i<arr.length;i++){ arr[i] = arr[i]/2.0;}alert(arr); //--> </script> 例,for in循环遍历数组 复制代码 代码如下: <html><body>

  • js 数组的for循环到底应该怎么写?

    然后来看看今天我开始怀疑哪个权威哦家伙了... 自从开始学编程,自从接触到数组这个东西,我就一直在不同的地点和不同的时间不断看到有人提醒:在用for遍历数组的时候一定要用 for(var i=0,n=arr2.length;i<n;i++)的方式哦,而不要用for(var i=0;i>arr.length;i++)的方式哦,因为用脑子想想也知道,第二种方法的第二部分会一直去计算数组的length,所以自然效率比较低. 哦?我们这里不说其他程序语言,而只讨论js,因为不同的语言,实现可能不同,其

  • JS简单循环遍历json数组的方法

    本文实例讲述了JS简单循环遍历json数组的方法.分享给大家供大家参考,具体如下: 例如数据库里面的json字符串是这样的 var str = '[{"name":"宗2瓜","num":"1","price":"122"},{"name":"宗呱呱","num":"1","price":

  • js判断数组key是否存在(不用循环)的简单实例

    实例如下: var aaa = { "0":"a", "1":"b", "2":"c", "aa":"d", "4":"e" }; alert(aaa .hasOwnProperty(4));//true 以上这篇js判断数组key是否存在(不用循环)的简单实例就是小编分享给大家的全部内容了,希望能给大家一个

  • javascript中利用数组实现的循环队列代码

    //循环队列 function CircleQueue(size){ this.initQueue(size); } CircleQueue.prototype = { //初始化队列 initQueue : function(size){ this.size = size; this.list = new Array(); this.capacity = size + 1; this.head = 0; this.tail = 0; }, //压入队列 enterQueue : functio

  • JS数组的遍历方式for循环与for...in

    JS数组的遍历方法有两种: 第一种:一般的for循环,例如: var a = new Array("first", "second", "third") for(var i = 0;i < a.length; i++) { document.write(a[i]+","); } 输出的结果:fitst,second,third 第一种:用for...in 这种遍历的方式,例如: var arr = new Array(&

  • JavaScript中关于for循环删除数组元素内容时出现的问题

    昨天用for循环进行数组去重的时候出现的问题, 首先,用双重for循环把前一个和所有后面的元素进行比较,如果相等则删除. 但是,如果数组里面有三个以上连续相等的元素的时候,就会出现问题. var arr = [1,1,1,2,2]; for(var i=0; i<arr.length-1; i++){ for(var j=i+1; j<arr.length; j++){ if(arr[i] === arr[j]){ arr.splice(j,1); } } } document.write(&

  • js使用for循环查询数组中是否存在某个值

    应为IE8不支持indexOf,所有写一个for循环方法来判断是否存在,并返回true false function isCon(arr, val){ for(var i=0; i<arr.length; i++){ if(arr[i] == val) return true; } return false; } 在js中添加此方法,在调用处调用该方法 window.onload = function(){ var arr=new Array(1,2,3,2,4,2,5,6,7,2,4,3,18

  • JavaScript数组和循环详解

    数组是元素的一个有序组合.在JavaScript中,数组可以使用正式的对象表示法来创建,或者可以使用直接量表示法来初始化. 复制代码 代码如下: var arrObject = new Array("val1", "val2"); // 作为对象的数组 var arrLiteral = ["val1", "val2"]; // 数组直接量 对于开发者来说,这没有区别:在直接量和对象上都可以调用一个Array方法.对于JavaS

  • JavaScript数组方法实例详解

    目录 简介 创建数组 创建方法 详解 方法大全 join() push()和 pop() shift() 和 unshift() sort() reverse() concat() slice() splice() indexOf()和 lastIndexOf() forEach() map() filter() fill()  (ES6 新增) every() some() includes() (ES7) reduce()和 reduceRight() toLocaleString() 和

  • JavaScript数组的使用详解

    目录 一.数组的创建 二.数组的元素和长度 三.数组的遍历 四.数组的常用方法 一.数组的创建 第一种: var 数组名 = new Array();创建一个空数组 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script> var arr=new Array(); console.log(arr)//以日志

  • javaScript数组迭代方法详解

    本文为大家介绍了javaScript数组迭代方法,供大家参考,具体内容如下 每个方法都接收两个参数:要在每一项上运行的函数  和  (可选的)运行该函数的作用域对象. 传入这些方法中的函数会接收三个参数:数组项的值,该项在数组中的位置,数组对象本身. forEach()  对数组中的每一项运行 给定函数.该方法没有返回值. every()  对数组中的每一项运行 给定函数,如果数组的每一项都返回true,则返回true. some()  对数组中的每一项运行 给定函数,如果数组的任意一项返回tr

  • 关于javascript的一些知识以及循环详解

    javascript的一些知识点: 1.常用的五大浏览器:chrome,firefox,Safari,ie,opera 2.浏览器是如何工作的简化版: 3.Js由ECMAjavascript;DOM;BOM组成: 4.js是弱类型语言(即需要游览器解析了才知道是什么类型的): 5.js是脚本语言(边解析边执行): 6.script也分行内样式,嵌套样式和外联样式. 外联样式一般写在body的最后,因为放在前面会先加载js代码然后再干其他的,影响用户体验. 7.同步和异步 同步:一行一行依次执行.

  • JavaScript 语句之常用 for 循环详解

    JavaScript中循环语句不少,for.for in.for of和forEach循环,今天对比Array.Object.Set(ES6).Map(ES6)四种数据结构循环语句支持的情况及区别. 新建四种数据类型的测试数据 let arr = [1, 2, 3, 4, 5, 6]; let obj = { a: 1, b: 2, c: 3 }; let map = new Map([['a', 'a1'], ['b', 'b2'], ['c', 'c3']]); let set = new

  • javascript中正则表达式语法详解

    好久都没有写博客了,主要是太懒了,尤其是在阳春三月,风和日丽的日子,太阳暖暖的照在身上,真想美美的睡上一觉.就导致了这篇博客拖到现在才开始动笔,javascript的正则这一块也不是什么新的东西,主要是以前本人一遇到写正则的需求就开始头大,头疼,网上剽窃,东拼西凑,反正就是各种不适应,所以我打算系统的把正则表达式看一遍,一来是自己有所提升,这一块知识点的查漏补缺,二来是给大家分享一下.好了,下面我们直接进入主题: 正则是匹配字符串特定模式的一种表达式,官方是这样说的,但我的理解不外乎就是匹配字符

  • JavaScript数据结构链表知识详解

    最近在看<javascript数据结构和算法>这本书,补一下数据结构和算法部分的知识,觉得自己这块是短板. 链表:存储有序的元素集合,但不同于数组,链表中的元素在内存中不是连续放置的.每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(也称指针或链接)组成. 好处:可以添加或移除任意项,它会按需扩容,且不需要移动其他元素. 与数组的区别: 数组:可以直接访问任何位置的任何元素: 链表:想要访问链表中的一个元素,需要从起点(表头)开始迭代列表直到找到所需的元素. 做点小笔记. funct

  • JavaScript String 对象常用方法详解

    字符串是不可变的.字符串方法,不会改变原有字符串的内容,而是返回一个新字符串. charAt():返回在指定位置的字符. concat():连接两个字符串文本,并返回一个新的字符串. indexOf(): indexOf() 方法返回指定值在字符串对象中首次出现的位置. match(): 使用正则表达式与字符串相比较. replace(): 被用来在正则表达式和字符串直接比较,然后用新的子串来替换被匹配的子串. slice(): 摘取一个字符串区域,返回一个新的字符串. split(): 通过分

  • jquery 遍历数组 each 方法详解

    JQuery拿取对象的方式 $('#id') :通过元素的id $('tagName') : 通过元素的标签名 $('tagName tagName') : 通过元素的标签名,eg: $('ul li') $('tagName#id): 通过元素的id和标签名 $(':checkbox'):拿取input的 type为checkbox'的所有元素: Eg: <input type="checkbox" name="appetizers" value="

随机推荐