数组是js中最常见的数据结构
1.创建数组的几种方式
1 var arr = []; 2 //可以直接将元素放在[]中; 3 var arr = [1,2,3,4,5];
或者调用Array的构造函数创建
1 var arr = new Array(); 2 //如果传入1个参数表示定义了数组的长度: 3 var arr = new Array(10); 4 //传入多个参数就作为数组的初始值: 5 var arr = new Array(1,2,3,4,5);
建议使用[]的方式创建
2.可以使用Array.isArray()来判断一个对象是不是数组
1 var arr = [1,2,3]; 2 var str = 'test'; 3 console.log(Array.isArray(arr)); //true 4 console.log(Array.isArray(str)); //false
3.一些常用的方法
1)字符串的split()生成数组
1 //调用字符串的split()方法 2 //从经典的hello world开始 3 var sentence = 'hello world'; 4 var words = sentence.split(" "); 5 for (var i = 0; i < words.length; i++) { 6 console.log(i + ':' + words[i]); 7 } 8 //0:hello 9 //1:world
2)数组的join()方法转化成字符串
1 var numbers = [1, 2, 3, 4, 5]; 2 var numStr = numbers.join();//join不传参数,默认以逗号分隔 3 console.log(numStr);
3)indexOf()和lastIndexOf()
1 //indexOf() 2 var names = ['zhang', 'wang', 'li', 'zhao','zhang']; 3 var name1 = names.indexOf('zhan'); 4 var name2 = names.indexOf('zhang'); 5 console.log(name1);//-1 表示不存在,返回-1 6 console.log(name2);//0 第一个与参数相同的元素所在位置的索引 7 //与之相对应的lastIndexOf() 8 var name3 = names.lastIndexOf('zhang'); 9 console.log(name3);//4 最后一个与参数相同元素所在的位置的索引
4)push()和unshift()
1 var nums = [1, 2, 3]; 2 nums.push(4);//向数组尾部添加一个元素 3 nums.unshift(5);//向数组头部添加一个元素 4 console.log(nums);//[ 5, 1, 2, 3, 4 ]
5)pop()和shift()
1 var someNumbers = [1, 2, 3, 4, 5]; 2 var num1 = someNumbers.pop();//删除数组最后一个元素 返回被删除的元素 3 var num2 = someNumbers.shift();//删除数组第一个元素 返回被删除的元素 4 console.log(num1);//5 5 console.log(num2);//1 6 console.log(someNumbers);//[2,3,4]
6)concat()
1 //注意合并顺序 2 var balls1 = ['football', 'basketball']; 3 var balls2 = ['volleyball', 'tennis']; 4 var ballsF = balls1.concat(balls2); 5 console.log(ballsF);//[ 'football', 'basketball', 'volleyball', 'tennis' ] 6 var ballsL = balls2.concat(balls1); 7 console.log(ballsL);//[ 'volleyball', 'tennis', 'football', 'basketball' ]
7)splice()
1 //这个方法非常强大,接受3个参数 2 //1.起始索引 3 //2.要删除的元素个数(添加元素时为0) 4 //3.想要添加进数组的元素 5 var countries = ['China', 'USA', 'UK', 'Germany']; 6 var country = countries.splice(2, 1); 7 console.log(country);//[ 'UK' ] 8 console.log(countries);//[ 'China', 'USA', 'Germany' ] 9 countries.splice(1, 0, 'Spain'); 10 console.log(countries);//[ 'China', 'Spain', 'USA', 'Germany' ]
8)reverse()和sort()
1 var digit = [1, 2, 3, 4, 5]; 2 digit.reverse();//将数组的顺序进行翻转 3 console.log(digit);//[ 5, 4, 3, 2, 1 ] 4 //进行排序 5 //第一种情况 6 var computers1 = ['Apple', 'HP', 'Lenovo', 'Asus', 'Dale']; 7 computers1.sort(); 8 console.log(computers1);//[ 'Apple', 'Asus', 'Dale', 'HP', 'Lenovo' ] 9 //第二种情况 10 var computers2 = ['apple', 'hp', 'Lenovo', 'Asus', 'Dale']; 11 computers2.sort(); 12 console.log(computers2);//[ 'Asus', 'Dale', 'Lenovo', 'apple', 'hp' ] 13 function compare(str1, str2) { 14 return str1.toUpperCase() > str2.toUpperCase(); 15 } 16 computers2.sort(compare); 17 console.log(computers2); 18 //一般来讲对数组进行排序,最好定义一个compare函数
4.迭代器方法
1)forEach()
1 function square(num) { 2 console.log(num, num * num); 3 } 4 var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; 5 numbers.forEach(square); 6 // 1 1 7 // 2 4 8 // 3 9 9 // 4 16 10 // 5 25 11 // 6 36 12 // 7 49 13 // 8 64 14 // 9 81 15 // 10 100
2)every()和some()
1 //every()接受一个返回值为布尔类型的函数,对数组中的每个元素使用该函数。若全部为true,则返回true,类似&& 2 //some()接受函数跟every()一样,但是只要有一个为true,则返回true,类似|| 3 function isEven(num) { 4 return num % 2 === 0; 5 } 6 // 全为偶数 7 var nums = [2, 4, 6, 8, 10]; 8 var even = nums.every(isEven); 9 var evenSome1 = nums.some(isEven); 10 console.log(even);//true 全部为true 11 console.log(evenSome1);//true 至少有一个为true 12 //不全为偶数 13 var nums1 = [2, 3, 4, 6, 8, 10]; 14 var even2 = nums1.every(isEven); 15 var evenSome2 = nums1.some(isEven); 16 console.log(even2);//false 至少有一个不为true 17 console.log(evenSome2);//true 至少有一个为true 18 //全都不是偶数 19 var oddNums = [1, 3, 5, 7, 9]; 20 var odd = oddNums.some(isEven); 21 console.log(odd);//false 全为false
3)reduce()
1 //从右到左,依次对数组中的元素执行该函数 2 function add(total, current) { 3 return total + current; 4 } 5 var nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; 6 var sum = nums.reduce(add); 7 console.log(sum);//55
4)map和filter()
1 //map和forEach有些相似,区别是map会返回一个新的数组 2 function square(num) { 3 return num * num; 4 } 5 var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; 6 var newValue = numbers.forEach(square); 7 console.log(newValue);//undefined 8 var newNumbers = numbers.map(square); 9 console.log(newNumbers);//[ 1, 4, 9, 16, 25, 36, 49, 64, 81, 100 ] 10 //filter和every()有些类似,区别是filter返回一个新数组,数组中包含应用该函数后结果为true的元素 11 function isEven(num) { 12 return num % 2 === 0; 13 } 14 function isOdd(num) { 15 return num % 2 !== 0; 16 } 17 var nums = []; 18 for (var i = 0; i < 20; i++) { 19 nums.push(i); 20 } 21 var evens = nums.filter(isEven); 22 var odds = nums.filter(isOdd); 23 console.log(evens);//[ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18 ] 24 console.log(odds);//[ 1, 3, 5, 7, 9, 11, 13, 15, 17, 19 ]
总结:数组是计算机编程中最常见的数据结构; 而JavaScript中数组是一种特殊的对象,使用起来比较灵活。
创建、存取、查找和排序都有不同的方式,在使用时应该根据业务场景思考哪种更合适。