2020-10-22(数组排序、二维数组拍平、多维数组变一维数组、对象创建、构造函数创建)

本文介绍了JavaScript中数组的排序方法,包括冒泡法和sort(),并探讨了sort()方法的工作原理。接着讲解了如何将二维和多维数组拍平成一维数组,提到了reduce()方法、字符串拼接以及递归的应用。最后,文章讨论了对象的创建方式,如字面量创建、索引创建以及构造函数创建,并提及对象与字符串之间的转换用途。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);//重新转换回来之后,可以使用属性取值
  • 对象与字符串的转换是为了方便存储和数据传输
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值