这里的比较函数的作用是什么呢?其实是数组依次将数组元素复制给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);