系列文章: 第一章 jsの实际操作1
数组是多个变量值的集合,数组是Array 对象的实例,所以可以像对象一样调用方法。
检测变量是否为数组类型
console.log(Array.isArray([1, "后盾人", "hdcms"])); //true console.log(Array.isArray(9)); //false数组=>字符串
// 大部分数据类型都可以使用.toString() 函数转换为字符串。 console.log(['a','xiLin','love'].toString()) //a,xiLin,love // 也可以使用函数 String 转换为字符串。 console.log(String(['a','xiLin','love'])) //a,xiLin,love // 或使用join连接为字符串 console.log(['a','xiLin','love'].join('-')) //a-xiLin-love使用Array.from可将类数组转换为数组,类数组指包含 length 属性或可迭代的对象。
//第一个参数为要转换的数据,第二个参数为类似于map 函数的回调方法 let str = '后盾人'; console.log(Array.from(str)); //["后", "盾", "人"] //为对象设置length属性后也可以转换为数组,但要下标为数值或数值字符串 let user = { 0: '后盾人', '1': 18, length: 2 }; console.log(Array.from(user)); //["后盾人", 18]解构是一种更简洁的赋值特性,可以理解为分解一个数据的结构
//数组使用 let xl = ['希林','xiLin'] let [a,b] = xl console.log(a) //希林 // 解构赋值数组 function lin(){ return ['希林','xiLin'] } let [a,b] = lin() console.log(a) //希林 let array = [1,2,3] let lin = ['a','b'] array.push(...lin) console.log(array) //(5) [1, 2, 3, "a", "b"]从末尾弹出元素,直接改变元数组,返回值为弹出的元素
let arr = ['xiLin','abc','希林'] let vars = arr.pop() console.log(arr) //(2) ["xiLin", "abc"] console.log(vars) //希林从数组前面取出一个元素
let arr = ['xiLin','abc','希林'] let vars = arr.shift() console.log(arr) // ["abc", "希林"] console.log(vars) // xiLin从数组前面添加元素
let arr = ['xiLin','abc','希林'] let vars = arr.unshift('new','123') console.log(arr) // (5) ["new", "123", "xiLin", "abc", "希林"] console.log(vars) // 5使用fill 填充数组元素
console.dir(Array(4).fill("后盾人")); //["后盾人", "后盾人", "后盾人", "后盾人"] console.log([1,2,3,4].fill('希林',1,3)) //(4) [1, "希林", "希林", 4]使用 slice 方法从数组中截取部分元素组合成新数组(并不会改变原数组),不传第二个参数时截取到数组的最后元素。
let arr = [1,2,3,4,5] let xl = arr.slice(2,4) console.log(xl) //(2) [3, 4] console.log(arr) //(5) [1, 2, 3, 4, 5]使用 splice 方法可以添加、删除、替换数组中的元素,会对原数组进行改变,返回值为删除的元素。
删除数组元素第一个参数为从哪开始删除,第二个参数为删除的数量。
let arr = [0, 1, 2, 3, 4, 5, 6]; console.log(arr.splice(1, 3)); //返回删除的元素 [1, 2, 3] console.log(arr); //删除数据后的原数组 [0, 4, 5, 6] //通过指定第三个参数来设置在删除位置添加的元素 let arr = [0, 1, 2, 3, 4, 5, 6]; console.log(arr.splice(1, 3, 'hdcms', '后盾人')); //[1, 2, 3] console.log(arr); //[0, "hdcms", "后盾人", 4, 5, 6]数组元素位置调整函数
let arr = [1, 2, 3, 4, 5, 6] function move(array, from, to) { if (from < 0 || to >= array.length) { console.error("参数错误") return } const newArray = [...array] let item = newArray.splice(from, 1) newArray.splice(to, 0, ...item) return newArray } console.table(move(arr, 1, 4))清空数组
//将数组值修改为[]可以清空数组,如果有多个引用时数组在内存中存在被其他变量引用。 let user = ['xiLin','Tom'] let cms = user user = [] console.log(user) //[] console.log(cms) //(2) ["xiLin", "Tom"] //将数组length设置为0也可以清空数组 let user = [{ name: "hdcms" }, { name: "后盾人" }]; user.length = 0; console.log(user); //使用splice方法删除所有数组元素 let user = [{ name: "hdcms" }, { name: "后盾人" }]; user.splice(0, user.length); console.log(user); //使用pop/shift删除所有元素,来清空数组 let user = [{ name: "hdcms" }, { name: "后盾人" }]; while (user.pop()) {} console.log(user);使用join连接成字符串
let arr = [1, "后盾人", "hdcms"]; console.log(arr.join('-')); //1-后盾人-hdcms 使用join可以指定转换的连接方式split 方法用于将字符串分割成数组,类似join方法的反函数。
let price = "99,78,68"; console.log(price.split(",")); //["99", "78", "68"]concat方法用于连接两个或多个数组,元素是值类型的是复制操作,如果是引用类型还是指向同一对象
let array = ["hdcms", "houdunren"]; let hd = [1, 2]; let cms = [3, 4]; console.log(array.concat(hd, cms)); //["hdcms", "houdunren", 1, 2, 3, 4] //可以使用扩展语法实现连接 console.log([...array, ...hd, ...cms]);数组包含多种查找的函数,需要把这些函数掌握清楚,然后根据不同场景选择合适的函数。
使用 indexOf 从前向后查找元素出现的位置,如果找不到返回 -1。
let arr = [7, 3, 2, 8, 2, 6]; console.log(arr.indexOf(2)); // 2 从前面查找2出现的位置我们来实现一个自已经的includes函数,来加深对includes方法的了解
function includes(array, item) { for (const key of array) { if (item === key) return true; }return false; } console.log(includes([1, 2, 3], 3))find 方法找到后会把值返回出来
如果找不到返回值为undefined, 返回第一次找到的值,不继续查找 let arr = ["hdcms", "houdunren", "hdcms"]; let find = arr.find(function(item) { return item == "hdcms"; }); console.log(find); //hdcms const user = [{ name: "李四" }, { name: "张三" }, { name: "后盾人" }]; const find = user.find(user => (user.name = "后盾人")); console.log(find); //{name: "后盾人"}下面是按课程点击数由高到低排序
let lessons = [ { title: "媒体查询响应式布局", click: 78 }, { title: "FLEX 弹性盒模型", click: 12 }, { title: "MYSQL多表查询随意操作", click: 99 } ]; let sortLessons = lessons.sort((v1, v2) => v2.click - v1.click); console.log(sortLessons); 排序原理 let arr = [1, 5, 3, 9, 7]; function sort(array, callback) { for (const n in array) { for (const m in array) { if (callback(array[n], array[m]) < 0) { let temp = array[n]; array[n] = array[m]; array[m] = temp; } } } return array; } arr = sort(arr, function(a, b) { return a - b; }); console.table(arr);根据数组长度结合for 循环来遍历数组
let lessons = [ { title: '媒体查询响应式布局', category: 'css' }, { title: 'FLEX 弹性盒模型', category: 'css' }, { title: 'MYSQL多表查询随意操作', category: 'mysql' } ]; for( let i = 0 ; i<lessons.length; i++){ lessons[i] = `后盾人 : ${lessons[i].title}` } console.table(lessons)forEach使函数作用在每个数组元素上,但是没有返回值。 可以直接操作DOM
let lessons = [ {title: '媒体查询响应式布局',category: 'css'}, {title: 'FLEX 弹性盒模型',category: 'css'}, {title: 'MYSQL多表查询随意操作',category: 'mysql'} ]; lessons.forEach((item, index, array) => { item.title = item.title.substr(0, 5); }); console.log(lessons);遍历时的 key 值为数组的索引
let lessons = [ {title: '媒体查询响应式布局',category: 'css'}, {title: 'FLEX 弹性盒模型',category: 'css'}, {title: 'MYSQL多表查询随意操作',category: 'mysql'} ]; for (const key in lessons) { console.log(`标题: ${lessons[key].title}`); }for/of 每次循环取其中的值而不是索引。
//这里value是一个值类型,value对原数组不变 let arr = [1, 2, 3, 4] for (let value of arr) { value += 10 } console.log(arr) //(4) [1, 2, 3, 4] //这里value是一个对象,改变value原数组也会改变 let arr1 = [{ n: 1 }, { n: 2 }] for (let value of arr1) { value.n += 10 } console.log(arr1) //[{ n: 11 }, { n: 12 }]数组中可以使用多种迭代器方法
//获取数组的所有值 let arr = ['xiLin','希林'] for (const value of arr.values()) { console.log(value) //xiLin 希林 } //获取数组所有键 for(let key of arr.keys()){ console.log(key) //0 1 } //解构获取内容(对象章节会详细讲解) for (const iterator of arr.entries()) { console.log(iterator) //(2) [0, "xiLin"] (2) [1, "希林"] } const xl = ['a','b'] for (const [key,value] of xl.entries()) { console.log(key,value) //0 "a" 1 "b" }every 用于递归的检测元素,要所有元素操作都要返回真结果才为真。
//every语法 let arr = ['xiLin','Tom','mimi'] arr.every((item,index,arr)=>{ console.log(item,index,arr) return true }) let user = [ { name: 'xiLin', js: 66 }, { name: 'xiLn', js: 86 }, { name: 'xiin', js: 76 } ] const res = user.every((item) => { return item.js >= 60 }) console.log(res?'全及格':'有同学不及格')使用 some 函数可以递归的检测元素,如果有一个返回true,表达式结果就是真。第一个参数为元素,第二个参数为索引,第三个参数为原数组。
let kewords = ['黄', '赌', '毒'] let title = document.querySelector('[name = "title"]') title.addEventListener('keyup', function () { let res = kewords.some((keyword) => { return this.value.indexOf(keyword) !== -1 }) document.querySelector('span').innerHTML = res ? '' : '输入必须有' + kewords.join(',') })filter 使用 filter 可以过滤数据中元素,下面是获取所有在CSS栏目的课程。
let lessons = [ {title: '媒体查询响应式布局',category: 'css'}, {title: 'FLEX 弹性盒模型',category: 'css'}, {title: 'MYSQL多表查询随意操作',category: 'mysql'} ]; let cssLessons = lessons.filter(function (item, index, array) { if (item.category.toLowerCase() == 'css') { return true; } }); console.log(cssLessons); //我们来写一个过滤元素的方法来加深些技术 function except(array, excepts) { const newArray = []; for (const elem of array) if (!excepts.includes(elem)) newArray.push(elem); return newArray; } const array = [1, 2, 3, 4]; console.log(except(array, [2, 3])); //[1,4]使用 map 映射可以在数组的所有元素上应用函数,用于映射出新的值。
let lessons = [ { title: '媒体查询响应式布局', category: 'css' }, { title: 'FLEX 弹性盒模型', category: 'css' }, { title: 'MYSQL多表查询随意操作', category: 'mysql' } ]; let myMap = lessons.map((item, index, arr) => { item.title = `"abc" ${item['title']}` return item; }) console.log(lessons)使用 reduce 与 reduceRight 函数可以迭代数组的所有元素,reduce 从前开始 reduceRight 从后面开始。下面通过函数计算课程点击数的和。
第一个参数是执行函数,第二个参数为初始值
传入第二个参数时将所有元素循环一遍 不传第二个参数时从第二个元素开始循环
let arr = [1,2,3,4,5] arr.reduce((pre,cur,index,arr)=>{ console.log(pre,cur) return cur }) arr.reduce((pre,cur,index,arr)=>{ console.warn(pre,cur) return cur },0)