单数组排序
sort()函数
数组对象的sort方法可以按照一定的顺序把数组元素重新排列起来。通常情况下,都是按照字幕顺序排列。在使用sort()排序时,每次比较两个元素时都会执行比较函数,并将两个元素作为参数传递给比较函数。比较函数有以下两种返回值。
1、如果返回值大于0,则交换两个元素的位置
2、如果返回值小于或等于0,则不进行操作。
JavaScript代码
例1
假定有如下数组:
代码如下 |
复制代码 |
var homes = [{
"h_id": "3",
"city": "Dallas",
"state": "TX",
"zip": "75201",
"price": "162500"
}, {
"h_id": "4",
"city": "Bevery Hills",
"state": "CA",
"zip": "90210",
"price": "319250"
}, {
"h_id": "5",
"city": "New York",
"state": "NY",
"zip": "00010",
"price": "962500"
}];
|
可以通过下面方法对数组按价格进行排序:
代码如下 |
复制代码 |
homes.sort(function(a,b) { return parseFloat(a.price) - parseFloat(b.price) } );
|
单个数组中的元素排序
代码如下 |
复制代码 |
<script type="text/javascript">
function sort_desc(str)//对数组降序的函数
{
str.sort(function compare(a,b){return b-a;});//是指对数组中1的对象中的第k个元素进行降序
return str;
}
function sort_asc(str)//对数组升序的函数
{
str.sort(function compare(a,b){return a-b;});//是指对数组中1的对象中的第k个元素进行升序
return str;
}
var tt=[4,10,8,98,2];
var bb=[];
bb=sort_desc(tt);
document.write(bb+"***降序输出");
var cc=[89,2,100,5];
var dd=[];
dd=sort_asc(cc);
document.write("<hr/>");//直线
document.write(dd+"***升序输出");
</script>
|
二维数组的排序。
1、按数值排序
假设有如下数组
代码如下 |
复制代码 |
var arr = [[1, 2, 3], [7, 2, 3], [3, 2, 3]];
|
这里如果我们要按每个子数组的第一列来排序要如何做呢,我们可以定义一个比较函数:
代码如下 |
复制代码 |
arr.sort(function(x, y){
return x[0] – y[0];
});
|
这里的比较函数的作用是什么呢?其实是数组依次将数组元素复制给x,y,比如首先将arr[0]赋给x,arr[1]赋给y,然后用x[0] – y[0],根据返回的值,如果返回的是大于0的数,那么就把数组中x放到y的后面,如果返回的是0则不变,小于0则将x放到y的前面,然后第一个排序好之后在进行下面两个的排序,直到整个数组排序完成。这是默认升序的比较函数,如果要降序排列则只需修改比较方式,改为 return y[0] – x[0] 即可,这里我们x[0]表示是按第一列进行排序,我们这里也可以按其他列进行排序。这里的排序默认就会修改arr的数组结构,所以排序完arr就是按第一列升序的数组了。
2、按字符串排序
按字符串排序的话呢,我们可以利用js提供的localeCompare方法,
localeCompare作用:用本地特定的顺序来比较两个字符串。
localeCompare方法的使用规则是stringObject.localeCompare(target),如果 stringObject 小于 target,则 localeCompare() 返回小于 0 的数。如果 stringObject 大于 target,则该方法返回大于 0 的数。如果两个字符串相等,或根据本地排序规则没有区别,该方法返回 0,器比较使用的是本地的规则,本地规则意思就是使用操作系统底层对这些本地字符排序的规则进行排序,默认情况下比如使用大于号这样的比较只是纯粹比较两个字符的unicode的数大小,会与很多语言不符。
比如
代码如下 |
复制代码 |
var arr = [['中','国'], ['啊','的'], ['哦','的']];
arr.sort(function(x, y){
return x[0].localeCompare(y[0]);
});
|
结果就会按第一列中文字的拼音排序,如果含有英文的话,默认是将英文放在前面,如果是纯英文的话,会按字母顺序来,大写排在小写的后面,这样就可以实现字符串的排序了,包括中文和中英混排。至于要降序排列的话,方法与上面相同,改成return y[0].localeCompare(x[0]); 即可。
数组去重,排序,寻找索引
代码如下 |
复制代码 |
//数组去重
Array.prototype.distinct = function(){
var filtered= [];
var _a = {};
for(var i = 0;i<this .length;i++){
if(!_a[this[i]]) {//如果已经有了就不再添加
_a[this[i]] = 1;
filtered.push(this[i])
}
}
return filtered;
};
//二分法 寻找索引
function search (arr,item,lower,upper){
lower = lower || 0;
upper = upper || arr.length-1;
if(lower == upper){
if(item == arr[upper]){
return upper;
}else{
return -1;
}
}else{
var middle = parseInt((lower+upper)/2);
if(item > a[middle]){
return search (arr,item,middle+1,upper);
}else{
return search (arr,item,lower,middle);
}
}
}
var a = [10,15,3,4,5,6,7,8,9,3,8,9];
a = a.distinct(); //[10, 15, 3, 4, 5, 6, 7, 8, 9]
a.sort(function(a,b){ return a-b;}); //排序 [3, 4, 5, 6, 7, 8, 9, 10, 15]
alert(search(a,9)); //6
|
遇到的面试题
Given an array that may contain nested arrays, return a flattened array. Input and out put are illustrated as follows.
将含有嵌套的数组排序输出。*号部分为需要写出的代码。
代码如下 |
复制代码 |
var input = [{a: 'a'}, 'b', ['c', 'd'], ['e', ['f']], 'g'];
function flatten_array(arr){
var out = [];
*******;
return out;
}
|
这个题目很明显应该用递归解决:(修改感谢@felix021提醒...)
代码如下 |
复制代码 |
var input = [{a: 'a'}, 'b', ['c', 'd'], ['e', ['f']], 'g'];
var out = [];
loop(input);
function loop(object) {
for( var a in object ) {
if( typeof(object) === 'object' ) {
loop(object[a]);
}else{
out.push(object[a]);
}
}
}
console.log(out);
|
|