JS编程修炼(一)

Q1:找出元素 item 在给定数组 arr 中的位置 ,如果数组中存在 item,则返回元素在数组中的位置,否则返回 -1.

function indexOf(arr, item) {
    if(arr.__proto__.indexOf){
        return arr.indexOf(item);
    }
    else{
        for(var i=0;i<arr.length;i++){
            if(arr[i] == item)
                return i;
        }
    }
    return -1;
}

注意的一点就是想要用Js的内置方法需要先检验下该方法是否存在。

Q2:计算给定数组 arr 中所有元素的总和 .

var arr = [1,2,3,4];
//常规循环
var sum1 = function(arr){
    var res = 0 ;
    arr.forEach(function(val,i){
        res += val;
    })
    return res;
}

//内置方法
var sum2 = function(arr){
    arr.reduce(function(prev,curr,id,arr){
        return prev+curr;
    })
}

var sum3 = function(arr){
    return eval(arr.join('+'));
}

这道在于你能找出几种方法去解决,eval()函数用于计算参数的js代码

Q3:移除数组 arr 中的所有值与 item 相等的元素。不要直接修改数组 arr,结果返回新的数组

var arr = [1,2,3,4,2];
// splice
var remove = function(arr,item){
    var res = arr.slice(0);
    for(var i = 0;i<res.length;i++){
        if(res[i] === item){
            res.splice(i,1);
            --i;
        }
    }

    return res;
}

// push
var remove1 = function(arr,item){
    var res = [];
    arr.forEach(function(val,i){
        if(val !== item){
            res.push(val);
        }
    })
    return res;
}

//filter
var remove2 = function(arr,item){
    if(Array.prototype.filter){
        return arr.filter(function(val){
            return val !== item;
        })
    }
}

splice()会改变原数组,返回截取的元素数组。slice()不会改变原数组,返回想要获取的元素,slice(start,end),参数为获取区间,end不写表示获取到结束位置。

Q4:在数组 arr 末尾添加元素 item。不要直接修改数组 arr,结果返回新的数组

var arr = [1,2,3,4,2];
// slice
var append = function(arr,item){
    var res = arr.slice(0); // 拷贝数组
    res.push(item);

    return res;
}

// for
var append1 = function(arr,item){
    var res = [];
    arr.forEach(function(val,i,arr){
        res.push(val);
    })
    res.push(item);

    return res;
}

//concat
var append2 = function(arr,item){
    if(Array.prototype.concat){
        return arr.concat(item);  //返回新数组
    }
}

利用concat在末尾添加元素,可以添加单个元素或者是整个数组,返回新数组,不修改原数组。

Q5:删除数组 arr 第一个元素。不要直接修改数组 arr,结果返回新的数组 .

// shift
var curtail = function(arr){
    var res = arr.slice(0);
    res.shift();

    return res;
}

// slice
var curtail1 = function(arr){
    return arr.slice(1);
}

// filter
var curtail2 = function(arr){
    return arr.filter(function(val,i){
        if(i!=0)
            return val;
    })
}

Q6:统计数组 arr 中值等于 item 的元素出现的次数

var arr = [1,2,3,4,2];
// 直接计数
var count = function(arr,item){
    var cnt = 0;
    arr.forEach(function(val,i){
        val === item?cnt++:0;
    })
    return cnt;
}

//filter
var count1 = function(arr,item){
    return arr.filter(function(val){
        return val === item;
    }).length;
}

// reduce
var count2 = function(arr,item){
    var cnt;
    cnt = arr.reduce(function(prev,curr){
        return curr === item? ++prev : prev;
    },0);

    return cnt;
}

Q7:找出数组 arr 中重复出现过的元素

var arr = [1,2,3,4,2,3];  // =>[2,3]

// 利用中间对象
var duplicates = function(arr){
    var res = [];
    var obj = {};

    arr.forEach(function(val,i){
        if(obj[val]==1){
            res.push(val);
            obj[val]++;

        }
        else if(obj[val]>1){
            obj[val]++;
        }
        else{
            obj[val]=1;
        }
    })

    return res;
}

// indexOf
var duplicates1 = function (arr){
    var res = [];
    arr.forEach(function(val){
        if(arr.indexOf(val) !== arr.lastIndexOf(val) && res.indexOf(val) === -1){
            res.push(val);
        }
    })

    return res;
}

// filter
var duplicates2 = function(arr){
    return arr.sort().filter(function(val,i){
        return arr[i]===arr[i+1] && arr[i]!==arr[i-1];
    })
}

其实也可以开多一个数组进行下标计数,但是考虑到可能要开很大的数,所以就没用这种方法。

Q8:为数组 arr 中的每个元素求二次方。不要直接修改数组 arr,结果返回新的数组

var arr = [1,2,3];    // => [1,4,9]

var square = function(arr){
    var res = [];

    arr.forEach(function(x){
        res.push(x*x);
    })

    return res;
}

// map
var square1 = function(arr){
    return arr.map(function(x){
        return x*x;
    })
}

Q9:在数组 arr 中,查找值与 item 相等的元素出现的所有位置

var arr = [1,2,3,2,4];    // => [1,3]

// indexOf
var find = function(arr,item){
    var pos = 0;
    var res = [];

    while(pos !== -1){
        pos = arr.indexOf(item,pos);
        if(pos === -1){
            break;
        }
        else{
            res.push(pos);
            pos++;
        }
    }

    return res;
}

// filter
var find1 = function(arr,item){
    var res = [];
    arr.filter(function(val,i){
        return val===item&&res.push(i);
    })

    return res;
}

// for
var find2 = function(arr,item){
    var res = [];
    arr.forEach(function(val,i){
        if(val === item){
            res.push(i);
        }
    })

    return res;
}

fitlter 真是无所不能啊。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值