一 在排序好的数组中加入值
var arr = [1,3,6,8,9,12] ; var n = 0 ; // 比前一个数大,比后一个数小 for(var i = 0 ; i < arr.length - 1 ; i++) { // 假如N小于第一个值直接插入到最前面 if(n < arr[0]) { arr.splice(0 , 0 , n); break } // 假如N大于最后一个值,那直接插入到最后面 if(n > arr[arr.length - 1]) { arr.push(n) break } if(n >= arr[i] && n <= arr[i+1] ) { arr.splice(i+1 , 0 , n) // 在插入值以后,数组会变长,后面就把插入的值加入判断,条件也会满足 break } } console.log(arr);
在一个已经排好序的数组中插入值又不想影响数组的排序时,先判断这个值是否比第一个值小或者比最后一个值大,满足的话直接插入并且结束循环,如果不满足的话就对比数组中所有值,直到找到一个比前面数大,比后面数小的一个位置,再插入。
二 数组的深浅复制
数组作为一个复杂数据类型,单纯的赋值复制,只是给新数组赋值了一个地址,假如给新数组添加一个内容,原来数组也会发生改变,这就是数组的浅复制。
var arr = [1,2,3,4,5] ; // 数组的浅复制 --- 只是复制了地址 // var arr2 = arr ; arr2.push('a')
例如以上代码。当arr2中添加了一个a后,arr也会随着发生改变。
而数组的深复制,不会对原数组产生任何影响,等于两个不同的数组。
深复制的方法有许多种,
1 遍历原数组,将数组中的每一个值提出,一个一个加入到新的数组中。
1 遍历原数组,将数组中的每一个值提出,一个一个加入到新的数组中。 var arr = [1,2,3,4,5] ; var arr2 = [] ; for(var i in arr){ arr2.push(arr[i]) } arr2.push('a')
2用slice()函数截取原数组中所有值,并加入新数组。
2用slice()函数截取原数组中所有值,并加入新数组。 var arr3 = arr.slice() ; console.log(arr3); arr3.push('a') ; console.log(arr);
注意!!!!,以上方法只对1维数组有效,对多维数组无效。多维数组的深复制可以用递归解决。
三 多维数组的深复制
多维数组的深复制比1维数组麻烦,如果是常规的办法。,第一维是深复制,但是第二维第三维还是浅复制,如果需要对多维数组进行深复制,我们可以用递归的方法解决。
先判断数组里的每一个值是不是数组,如果是则继续调用函数,同时将函数的参数改为这个这个数组的这个值。
如果这个数不是数组,则直接将这个数加入到新的数组中,最后输出这个新数组的结果
// 创建一个函数,参数为需要深复制的多维数组 function deepArr(arr) { // 创建一个新的数组 var newArr = [] ; // 遍历原数组 for(var i = 0 ; i < arr.length ; i++) { // 判断这个数组中的每一个值是不是一个数组,如果是,则继续调用这个函数本身,参数则变成了这个数组的第一个值 // 直到里面没有数组,再将这个值加入到新数组中 if(Array.isArray(arr[i])) { // 继续遍历数组 ,还是得到一个数组 var list = deepArr(arr[i]) ; // 再把得到的数组放入newArr newArr.push(list) } // 如果第一个值就不是数组,则直接将这个值加入到新数组中 else { newArr.push(arr[i]) ; } } // 最后把这个数组作为函数结果输出 return newArr }
四 JS快速生成CSS的表格
现在CSS里新建一个表格,在表格的头部输入标题(th)
然后给tbody取一个ID名 链接js后,将js里的数组加入到CSS中。
<body> <table> <thead> <tr> <th>姓名</th> <th>性别</th> <th>年龄</th> <th>地址</th> </tr> </thead> <tbody id="tb"> </tbody> </table> <script> var arr = [ ['方总' , '男' , '32' , '青年公寓'], ['师爷' , '男' , '42' , '青年公寓'], ['班长' , '男' , '18' , '江滩边上'], ['方总' , '男' , '32' , '青年公寓'], ['方总' , '男' , '32' , '青年公寓'], ['师爷' , '男' , '42' , '青年公寓'], ['班长' , '男' , '18' , '江滩边上'], ['方总' , '男' , '32' , '青年公寓'], ] // 创建一个空字符串 var res = '' ; // 遍历数组 for(var i in arr) { // 在数组的第一维加上一个tr标签,加入字符串 res += '<tr>' // 在遍历数组的第二维,在数组的第二维的每一个值加上td标签,并将这个值加入到字符串中 for(var j in arr[i]) { res += '<td>' + arr[i][j] + '</td>' } res += '</tr>' } console.log(res); // 链接CSS var oTb = document.getElementById('tb') ; // 给输入框加内容 value // 给标签加内容 innerHTML // 把RES的值加入到标签中 oTb.innerHTML = res ; </script>
五 JS快速生成九九乘法表
// 创建一个空字符串,用于存放每次循环计算的值 var res = '' ; // 第一层循环,代表99乘法表的行数,一共9行,所以循环9次 for(var i = 1 ; i <= 9 ; i++) { // 每循环一次加上一个P标签,用于换行 res += '<p>' // 第二层循环代表99乘法表的列数,J的最大值由行数决定,所以J的值不能大于I for(var j = 1 ; j <= i ; j++) { // 二层每循环一次,添加一个J*I,并且用SPAN包起来 res += '<span>' + j + '*' + i + '=' + i * j + '</span>' } res += '</p>' } console.log(res); var oBox = document.getElementById('box') ; // 最后将结果输出到 css中 oBox.innerHTML = res ;
六 对象的介绍,以及对象同数组的区别
数组:存储同一种类型的数据,
有序性
对象:描述同一类型的事物(属性,方法)
无序性
数组一般用来同一类型的数据,如数字,字母,字符串等,而且数组的每一个值都拥有一个角标,可以通过角标来寻找这个值。
对象一般用来描述同意类型的数据,例如我描述一个人的 姓名,年龄,体重,身高。
以及使用方法(函数)等等,对象没有角标,单数每一个数据都有键名和键值。
var dog = { name : '二哈', age : 3 , sex : '公', say : function () { console.log('汪'); } } 这就是一个简单的对象
对象也可以遍历,但是因为没有下标,所以只能用普通循环,或者for in 循环来遍历,
而且遍历的值是键名而不是键值,(冒号前面的是键名,代表这个数据的名字,冒号后面的是键值,代表这个名字的值。)
for(var key in dog) { // console.log(key); console.log(dog[key]); }
对象的创建方式也有两种,一种是直接创建,另外一种是实例化一个对象,方法同数组类似,只是数组是方括号,而对象是花括号。
对象的赋值同数组不同,对象赋值时需将键名同键值一起说明,这样才方便后续好找到这个数据。
// 声明一个变量为对象 var obj = {} // 实例化对象 -- 空对象 var obj = new Object() ; // 赋值 obj.name = '奔驰' ; obj.color = 'pink' ; obj.price = '100w' ;
对象的深复制与浅复制,
对象作为一个复杂数据类型,同样有深复制和浅复制,浅复制同数组一样,直接哇一个新对象等于一个旧对象,此时复制的也只是一个地址而已。
对象的深复制同数组类似,先声明一个空对象,再遍历旧对象,提出旧对象的每个值以后,将这个值赋值给新对象。
var person1 = { name : '方总', age : 18 } var person2 = new Object() ; for(var key in person1) { person2[key] = person1[key] }