JavaScript学习笔记——数组的Sort方法

本文详细介绍了JavaScript数组sort()方法的工作原理及应用,特别是如何通过自定义比较函数实现对不同类型的数组(如数字、字符串和对象)进行升序或降序排序。

数组的Sort方法

数组的sort()方法可对任何数组(数字数组、字符串数组、对象数组)按升序或降序排序

  • 需要传入sort()的参数:传入一个比较函数,这个函数知道怎样比较数组的某两个元素(定义了两个元素哪个是“较大”的,哪个是“较小”的)
  • 比较函数必须返回这三种值:大于0的数字、0或小于0的数字(一般为1,0,-1)
  • 升序或降序排序,通过比较函数的返回值来控制
  • 实现原理就是向函数传递函数关于函数的笔记),通过传入一个比较函数,我们可对任何数据集重用排序代码,获得了灵活性。

具体实现

特定的数据集进行排序,比较(数组中元素)的方式取决于元素的类型(数组/字符串/对象等)
就拿数字数组、名称数组和对象数组的排序来说,对它们进行排序时:

  • 对于数字,我们使用<、>和==进行比较;
  • 对于字符串,我们按字母顺序进行比较(在JavaScript中,也可以使用<、>和==进行比较);
  • 而对于对象,我们必须采用自定义的方式根据对象的属性进行比较。

Eg. 有一个对象数组如下:

var products = [ 
	{ name: "Grapefruit", calories: 170, color: "red", sold: 8200 },
	{ name: "Orange", calories: 160, color: "orange", sold: 12101 },
    { name: "Cola", calories: 210, color: "caramel", sold: 25412 },
    { name: "Diet Cola", calories: 0, color: "caramel", sold: 43922 },
    { name: "Lemon", calories: 200, color: "clear", sold: 14983 },
    { name: "Raspberry", calories: 180, color: "pink", sold: 9427 },
    { name: "Root Beer", calories: 200, color: "caramel", sold: 9909 },
    { name: "Water", calories: 0, color: "clear", sold: 62123 }
];
  1. 使用方法sort将一个的对象数组按名称(字符串Unicode值)升序排序
function compareName(colaA, colaB) {//按照name属性比较两个对象
	if (colaA.name > colaB.name) {
		return 1;
	} else if (colaA.name === colaB.name) {
		return 0;
	} else {
		return -1;
	}
}
console.log("\n------- sorting by name -------");
products.sort(compareName);
//printProducts(products);//打印结果

  1. 也可以将这个对象数组按照销量(数字)升序排序
function compareSold(colaA, colaB) {//按照sold属性比较两个对象
	if (colaA.sold > colaB.sold) {
		return 1;
	} else if (colaA.sold === colaB.sold) {
		return 0;
	} else {
		return -1;
	}
}

//////////////////按照数值大小比较时,等效的简单写法如下////////
function compareSold(colaA, colaB) {
	return (colaA.sold-colaB.sold);
}

console.log("\n------- sorting by sold -------");
products.sort(compareSold);
//printProducts(products);//打印结果

对于比较函数:

  • 如果返回值为1,sort就将第一项放在第二项后面
  • 如果返回值为0,第一项和第二项位置不变
  • 如果返回值为-1,sort就将第一项放在第二项前面

因此,上面的写法实现的是升序,如果要按降序排列,只需反转上述逻辑(让原本返回1的地方返回-1,让原本返回-1的地方返回1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值