刷题学习Javascript之一 Array部分函数的使用

刷题学习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());

发表评论

电子邮件地址不会被公开。 必填项已用*标注