数组的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)