数组处理
二维数组
非一维数组不能直接定义多维,需要层层定义,很多高级语言都是如此
只需加上
arrayname[0] = new Array();
SORT排序
js
// 一维简单数组
names.sort();
// 一维对象数组
users.sort(function (a, b) {
if (a.name < b.name) {
return -1;
}
if (a.name > b.name) {
return 1;
}
return 0;
});1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
现在让我们来了解一下我们是如何得出这两种解决方案的。
如何按字母顺序对一个名字数组进行排序
假设我们有一个名字的数组:
js
let names = ["John Doe", "Alex Doe", "Peter Doe", "Elon Doe"];1
我们可以用sort() 方法对这些名字按字母排序:
js
let sortedNames = names.sort();
console.log(sortedNames);1
2
2
这将返回一个按字母排序的名字数组:
js
["Alex Doe","Elon Doe","John Doe","Peter Doe"]1
注意:当一些名字以大写字母开头,而另一些以小写字母开头时,输出结果将是不正确的,因为sort() 方法将大写字母放在小写字母之前:
js
let names = ["John Doe", "alex Doe", "peter Doe", "Elon Doe"];
let sortedNames = names.sort();
console.log(sortedNames); // ["Elon Doe","John Doe","alex Doe","peter Doe"]1
2
3
4
2
3
4
所以你需要确保这些词的大小写都是一样的,否则它就不能按照我们的愿望按字母顺序返回名字。
在现实世界中,我们可能有一个用户数组,每个用户的信息都在一个对象中。这些信息可以是任何与用户名称有关的信息。比如说:
js
let users = [
{
name: "John Doe",
age: 17
},
{
name: "Elon Doe",
age: 27
},
{
name: "Alex Doe",
age: 14
}
];1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
看一下上面的对象,之前的方法中,我们只是在数组上直接应用sort() 方法,将无法工作。相反,它将抛出相同的数组,但项目不会按照我们想要的顺序排列。
我们将在比较函数旁边使用sort() 方法来按名字排列这个用户数组。
我们将使用比较函数来定义一个替代的排序顺序。根据参数的不同,它返回一个负值、零值或正值:
语法:
js
function(a, b){return a - b}1
当我们把这个比较函数传入sort() 方法时,它根据我们设定的条件对每个值进行比较,然后根据返回的值(负值、零值、正值)对每个名字进行排序:
- 如果结果是负的,
a被排序到b之前。 - 如果结果是正数,
b被排序在`a'之前。 - 如果结果是
0,则不会对这两个值的排序顺序做任何改变。
使用上面的例子,我们现在可以这样在比较函数旁边使用sort() 方法:
js
users.sort(function (a, b) {
if (a.name < b.name) {
return -1;
}
if (a.name > b.name) {
return 1;
}
return 0;
});
console.log(users);1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
上面的代码对每个名字进行比较。如果它大,它返回1。如果它小于,则返回-1。返回的值用于按字母顺序排列我们数组的值:
js
[
{
name: "Alex Doe",
age: 14
},
{
name: "Elon Doe",
age: 27
},
{
name: "John Doe",
age: 17
}
]1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
注意:就像我们之前看到的,这总是根据字母的大小写工作,并将大写字母排在小写字母之前:
js
let users = [
{
name: "alex Doe",
age: 14
},
{
name: "Elon Doe",
age: 27
},
{
name: "John Doe",
age: 17
}
];
users.sort(function (a, b) {
if (a.name < b.name) {
return -1;
}
if (a.name > b.name) {
return 1;
}
return 0;
});
console.log(users);1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
输出:
js
[
{
name: "Elon Doe",
age: 27
},
{
name: "John Doe",
age: 17
},
{
name: "alex Doe",
age: 14
}
]1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
在名字有不同字母大小写的情况下,最好在使用
sort()方法之前先将它们转换为特定的字母大小写。
手写快排sort
js
//(1)在数据集之中,选择一个元素作为"基准"(pivot)。
//(2)所有小于"基准"的元素,都移到"基准"的左边;所有大于"基准"的元素,都移到"基准"的右边。
//(3)对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。
var quickSort = function(arr) {
// 检查数组的元素个数,如果小于等于1,就返回。
if (arr.length <= 1) { return arr; }
// 选择"基准"(pivot),并将其与原数组分离
var pivotIndex = Math.floor(arr.length / 2);
var pivot = arr.splice(pivotIndex, 1)[0];
// 定义两个空数组,用来存放一左一右的两个子集
var left = [];
var right = [];
// 遍历数组,小于"基准"的元素放入左边的子集,大于基准的元素放入右边的子集。
for (var i = 0; i < arr.length; i++){
if (arr[i] < pivot) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
return quickSort(left).concat([pivot], quickSort(right));
};1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24