刷题学习Javascript之一
题目:
给定一个数组,将数组中奇数的数值进行升序排序,偶数保持原位
注意:如果输入空数组,则返回空数组,0不是奇数所以不用移动它;
方法一:
思路:遍历array
找出数组中的奇数,用arr
存找出来的奇数。并将偶数,存入数组brr
。对arr
进行从小到大排序。再遍历brr
将奇数插入到数组中。
function sortArray(array){
var arr = [], brr = [];
//遍历数组找出奇数push在arr数组中 ,将非奇数存放在brr中,
array.forEach((element,index) => {
if(element%2!=0){
arr.push(element);
array[index]=0;
}else{
brr[index] = element;
}
});
//对奇数数组进行排序
arr.sort();
var i = 0; //记录arr下标
//遍历brr将奇数插入至原来位置
for(var j=0;j<brr.length;j++){
if(brr[j]==null){
if(i<arr.length){
brr[j] = arr[i++];
}
}
}
return brr;
}
方法二:
解析思路:
function sortArray(array){
var odds = []; //存放奇数
var odd_keys = []; //记录奇数在原数组中的下标位置
//遍历array数组找出奇数并记录下标
for(i=0;i<array.length;i++){
if(array[i]%2===1){
odds.push(array[i])
odd_keys.push(i);
}
}
//对奇数数组进行排序从小到大,用数组的sort()方法
var sort_odds = odds.sort();
//循环遍历奇数下标,将奇数插入原来数组存放奇数的位置
for(j=0;j<odd_keys.length;j++){
array[odd_keys[j]] = sort_odds[j];
}
return array;
}
方法三:
使用Array的filter()、map()、sort()、shift()函数以及位运算符。
function sortArray(array){
var newArr = array.filter(s=>s&1).sort((a,b)=>a-b);
return array.map(s=>s&1?newArr.shift():s);
}
解读上述代码:
1、使用array.filter(s=>s&1)
方法相当于array.filter((s)=>{return s&1})
过滤判断出是奇数。
2、s&1
:位运算符 ,对s转换成2进制,奇数最后一位为1,即1&1
=true。偶数最后一位为 0 ,即0&1=false。所以array.filter(s=>s&1)
得到奇数数组。
var newArr = array.filter(s=>s&1).sort((a,b)=>a-b);
这句 得到数组中的所有奇数并升序排序。
3、使用map()
执行函数插入奇数操作。 遍历array
函数。s&1?newArr.shift():s
使用位运算符与三目运算符号 如果是奇数,则将数组当前值赋值为newArr.shift()
。删除newArr
数组中第一个元素,并将返回值赋给array
当前值。
filter()方法
创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。
- filter()不会对空数组进行检测
- filter()不会改变原始数组
语法
array.filter(function(currentValue,index,arr),thisValue);
function(currentValue,index,arr)。必须。函数,数组中的每个元素都回执行这个函数。
函数参数:
currentValue
:必须,当前元素的值
index
:可选,当前元素的索引值
arr
:可选,当前元素属于的数组对象
thisValue
: 可选,对象作为该执行回调时使用,传递给函数,作用“this”的值。如果省略了thisValue
,“this”的值为“undefined”
Array的 map()方法
使用例子:
var numbers = [4,9,16,25];
function myFunction(){
x = document.getElementById("demo")
x.innerHTML = numbers.map(Math.sqrt);
}
//输出结果:2,3,4,5
定义和用法
map() 方法 返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。
map()方法按照原始数组元素顺序依次处理元素。
- map()不会对空数组进行检测。
- map()不会改变原始数组。
语法:
array.map(function(currentValue,index,arr),thisValue)
参数说明:
同filter()参数。
Array.sort()函数
sort()方法用于对数组的元素进行排序。
arrayObject.sort(sortby)
参数 sortby: 可选,规定排序顺序。必须是函数。
- 返回值:对数组的引用。数组在原数组上进行排序,不生成副本。
- 如果未设置sortby排序规则,则默认按照ascii编码进行排序,如是字符串的话排序规则需要重定义。
例子:
设置排序,升序
var points = [40,100,1,5,25,10];
points.sort(function(a,b){return a-b});
//输出结果为 1,5,10,25,40,100
//可以用ES6箭头函数写成
points.sort((a,b)=>a-b);
设置排序,降序
var points = [40,100,1,5,25,10];
points.sort(function(a,b){return b-a});
//输出结果为 100,40,25,10,5,1
//可以用ES6箭头函数写成
points.sort((a,b)=>b-a);
数字排序(字母和降序)
var fruits = ["Banana","Orange","Apple","Mango"];
fruits.sort();
fruits.reverse();
//输出结果:Orange,Mango,Banana,Apple
Array.reverse()方法
颠倒数组中元素的顺序。
- 该方法会改变原来的数组,而不是创建新的数组返回。
Array.shift()方法
shift()方法用于把数组的第一个元素从其中删除。并返回第一个元素的值。
语法:arrayObject.shift()
返回值:数组原来的第一个元素的值。
- 如果数组是空的,那么shift()方法将不进行任何操作,返回undefined值。
- shift()方法不创建新的数组,而是直接对原数组进行操作,会改变原数组的长度。
- 要删除并返回数组的最后一个元素,使用pop()方法。
写法四
写法四调用方法以及思路如方法三
function sortArray(array){
var oddArr = array.filter(item=>item%2 !==0).sort((a,b)=>a-b);
return array.map(item=>item%2 ===0?item:oddArr.shift());