1、数组排序
1.使用冒泡法排序
var arr = [1,5,3,18,9,7,2];
function sort(arr){
for(i in arr){//遍历数组arr,把所有的值都拿一遍,这里产生的i是一个
//string类型,如果使用i的值,需要进行转换,
i = parseInt(i);
for(var j = i+1; j < arr.length; j++){//用上面的每一个值与下面
//的每一个值进行比较(这里的每一个值都是上面后面的值)
if(arr[i] > arr[j]){
temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
}
return arr;
}
console.log(sort(arr));//打印调用的结果
2.sort()方法排序
对于数组内的数据进行排序,有特定的方法,就是sort()方法
var arr = [1,5,3,18,9,7,2];
arr.sort(function(a,b){
if(a < b){//如果a<b,就让a在b的前面
return -1;
}
if(a == b){//如果a==b,a,b的位置不变
return 0;}
if(a > b){//如果a>b,就让b在a的前面
return 1;}
})
console.log(arr);// [1, 2, 3, 5, 7, 9, 18]
以上的-1,0,1好像能决定a,b位置关系,那么到底是正负数,还是只能是正负1呢,修改返回的值,如下
var arr = [1,5,3,18,9,7,2];
arr.sort(function(a,b){
if(a < b){
return -5;//这里修改为任意的负值
}
if(a == b){//如果a==b,a,b的位置不变
return 0;}
if(a > b){
return 4;//这里修改为任意的正值
}
})
console.log(arr);// [1, 2, 3, 5, 7, 9, 18]
结果没有发生改变,既然是正负决定a,b的位置,那么这个代码就可以简写了
var arr = [1,5,3,18,9,7,2];
arr.sort(function(a,b){
return a - b;
//当a < b 的时候,a - b 就会得到一个负值
//当a == b 的时候,a - b 就会得到0
//当a > b 的时候,a - b 就会得到一个正值
})
console.log(arr);// [1, 2, 3, 5, 7, 9, 18]
a - b能得到数组升序排列的结果,那么b - a会不会得到相反的结果呢?
var arr = [1,5,3,18,9,7,2];
arr.sort(function(a,b){
return b - a;
//当b > a 时, b - a得到的是正值,让 b 在 a 的前面
//当b < a 时, b - a得到的是负值,让 a 在 b 的前面
//也就是说,让值大的在前面,就形成了降序排列
})
console.log(arr);// [18, 9, 7, 5, 3, 2, 1]
2、二维数组拍平(数组里每一个元素都只能为数组)
var arr = [[1,2],[2,3],[4,5]];
//var arr = [1,[2,3],[4,5]]; //如果里面有元素不为数组,直接使用多
//维数组变一维数组的方法就可以
var result = arr.reduce(function (p,c) {
return p.concat(c);
});
console.log(result);
3、多维数组变一维数组
1.reduce()方法
var arr = [[1,[2,3]],[3,[4,5]],[5,[6,7]]];
var newArr = function (arr) {
return arr.reduce(function (p,c) {
return p.concat(Array.isArray(c)?newArr(c):c);
//这里判断内层的c是否为数组,如果是数组,递归调用,先拍平处理
},[])//这里的空数组,是为了让p第一次值为数组,就不用给p做判断
};
console.log(newArr(arr));
2.除了reduce() 方法,还可以使用字符串的方式
var arr = [1,[2,3,[4,5]],[6,7,[8,9]]];
var newArr = [];
var str = arr.toString();//1,2,3,4,5,6,7,8,9
// var str = arr.join(',');//join不会改变原数组,这里用join()和toString()是一样的;
//把上面的字符串用逗号去截成一个一个的元素
var arr1 = str.split(',');//(9) ["1", "2", "3", "4", "5", "6", "7", "8", "9"]
arr1.forEach(function (val,i) {
newArr.push(parseInt(val));
});//因为得到的全是字符串,需要用一个循环将每一个转换为Number,再装入新数组
console.log(newArr);//(9) [1, 2, 3, 4, 5, 6, 7, 8, 9]
3.可以继续延续reduce()方法的思想,通过递归的方法去做
var arr = [1,[2,3,[4,5]],[6,7,[8,9]]];
var newArr = [];
function fun(arr) {
arr.forEach(function (val,i) {
// return newArr.push(Array.isArray(val)?fun(val):val);
if(Array.isArray(val)){//如果你还是一个数组,我就继续把你打开,
fun(val);
}else {//只有你不在是一个数组的时候,我就把你添加到新数组中
newArr.push(val);
}
});
return newArr;
}
console.log(fun(arr));//[1, 2, 3, 4, 5, 6, 7, 8, 9]
4、对象创建
- 第一种,字面量方式创建是最简单的
- 对象的创建都是键值对的, 键名:键值(属性名:属性值)
- 对象中的属性都是可以通过对象.属性进行取值的(obj.)
//
var student = {
name:'唐僧',
sex:'男',
sayHello:function(){
console.log('hello');
}
}
console.log(student.name); //唐僧
- 第二种
//第二种
var fun = new Object();//先创建一个对象
fun.name = 'wo';//在外部通过对象.属性的方法进行赋值
fun.sayBye = function(){
console.log('Bye');
};
console.log(fun.name);//wo
fun.sayBye();//Bye
对象还可以储存复杂的数据,可以通过数组的索引去取每一个对象,再通过 .属性操作获得值
var person = [
{name:'猪八戒',age:20},
{name:'唐僧',age:50},
{name:'孙悟空',age:500}];
console.log(person[0].name);//猪八戒
5、构造函数创建
function Person(name,age){
this.name = name;//谁调用,this指向谁
this.age = age;
this.sayHello = function(){
console.log('hello');
}
}
var per1 = new Person('唐僧',18);//per1调用函数,所以this指向per1
console.log(per1.sayHello());//hello
6、补充(对象与字符串的转换)
var obj = {
name:'aa',
age:18
};
var str_obj = JSON.stringify(obj);//将对象转为字符串,转换之后就不能再通过 .属性 的方法来获取值
console.log(str_obj);
console.log(str_obj.age);//返回的是undefined
//当然字符串也可以转换为对象
var newObj = JSON.parse(str_obj);//将字符串转换为对象
console.log(newObj);
console.log(newObj.name);//重新转换回来之后,可以使用属性取值
- 对象与字符串的转换是为了方便存储和数据传输