编程数组题

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

function remove(arr, item) {
    var a=arr.slice(0);
    for(var i=0;i<arr.length;i++){
      if(a[i]==item){
        a.splice(i,1);
        i--;
      }
    }
    return a;
};
var b=new Array(1,2,3,4,2);
document.write(remove(b,2));

 2.如果数组中存在 item,则返回元素在数组中的位置,否则返回 -1

function indexOf(arr, item) {
            if (Array.prototype.indexOf){   //判断当前浏览器是否支持
                return arr.indexOf(item);
            } else {
                for (var i = 0; i < arr.length; i++){
                    if (arr[i] === item){
                        return i;
                    }
                }
            }
            return -1;     //总是把return -1暴漏在最外层
        }

3.数组求和

方法1:常规for循环

<script>
        function num(arr) {
            var s=0;
            for(var i=0;i<arr.length;i++){
                s+=arr[i];
            }
            console.log(s);//10
        }
        num([1,2,3,4]);
    </script>

方法2:使用递归

<script>
        function num(arr){
            var len=arr.length;
            if(len==0){
                return 0;
            }
            else if(len==1){
                return arr[0];
            }
            else{
                return arr[0]+num(arr.slice(1));
            }
        }
        console.log(num([1,2,3,4]));//10
    </script>

方法3. forEach遍历

forEach() 方法用于调用数组的每个元素,并将元素传递给回调函数。

array.forEach(function(currentValue, index, arr), thisValue)
参数描述
function(currentValue, index, arr)必需。 数组中每个元素需要调用的函数。
函数参数:
参数描述
currentValue必需。当前元素
index可选。当前元素的索引值。
arr可选。当前元素所属的数组对象。
thisValue可选。传递给函数的值一般用 "this" 值。
如果这个参数为空, "undefined" 会传递给 "this" 值
 <script>
        function num(arr){
            var s=0;
            arr.forEach(function(value,index,arr){
                s+=value;
            });
            console.log(s);
        }
        num([1,2,3,4]);//10
    </script>

方法4. eval函数

eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。

eval(string)
参数描述
string必需。要计算的字符串,其中含有要计算的 JavaScript 表达式或要执行的语句。

注意:

该方法只接受原始字符串作为参数,如果 string 参数不是原始字符串,那么该方法将不作任何改变地返回。因此请不要为 eval() 函数传递 String 对象来作为参数。

如果试图覆盖 eval 属性或把 eval() 方法赋予另一个属性,并通过该属性调用它,则 ECMAScript 实现允许抛出一个 EvalError 异常。

 

join() 方法用于把数组中的所有元素放入一个字符串。

元素是通过指定的分隔符进行分隔的。

arrayObject.join(separator)
参数描述
separator可选。指定要使用的分隔符。如果省略该参数,则使用逗号作为分隔符。
 <script>
        function num(arr) {
            console.log(eval(arr.join("+")));//join()将数组转化为字符串,用+连接   返回10
        }
        num([1,2,3,4])
    </script>

方法5.reduce()

reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。

reduce() 可以作为一个高阶函数,用于函数的 compose。

array.reduce(function(total, currentValue, currentIndex, arr), initialValue)
参数描述
function(total,currentValue, index,arr)必需。用于执行每个数组元素的函数。
函数参数:
参数描述
total必需。初始值, 或者计算结束后的返回值。
currentValue必需。当前元素
currentIndex可选。当前元素的索引
arr可选。当前元素所属的数组对象。
initialValue可选。传递给函数的初始值

 

  <script>
        function num(arr) {
            return arr.reduce(function(prev, curr, idx, arr){
                return s=prev+curr;
            });
        }
        num([1,2,3,4]);
        var s;
        console.log(s);//10
    </script>

3.移除数组 arr 中的所有值与 item 相等的元素,直接在给定的 arr 数组上进行操作,并将结果返回

  function removeWithoutCopy(arr, item) {
            for(var i=0;i<arr.length;i++){
                if(arr[i]==item){
                    arr.splice(i,1);
                    i=0;
                }
            }
           console.log(arr);//[1,3,4
        }
        removeWithoutCopy([1, 2, 2, 3, 4, 2, 2], 2)

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

方法1.

<script>
        function append(arr, item) {
            var newArr = arr.slice(0);
            newArr.push(item);
            console.log(newArr);//[1,2,3,4,10]
        }
        append([1,2,3,4],10)
    </script>

注意:不直接var newArr=arr;而用 var newArr = arr.slice(0)是因为直接赋值双方引用相等会改变原数组

方法2.

<script>
        var append = function(arr, item) {
            var length = arr.length, newArr = [];
            for (var i = 0; i < length; i++) {
                newArr.push(arr[i]);
            }
            newArr.push(item);
            return newArr;
        };
    </script>

方法3.concat() 

concat() 方法用于连接两个或多个数组。

该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。

arrayObject.concat(arrayX,arrayX,......,arrayX)
参数描述
arrayX

必需。该参数可以是具体的值,也可以是数组对象。可以是任意多个。

 

<script>
        var append = function(arr, item) {
            console.log(arr.concat(item));//[1,2,3,4,10]
            console.log(arr);//[1,2,3,4]
        };
        append([1,2,3,4],10)
    </script>

由运行结果可以看到,concat方法并不影响原数组的值

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

<script>
        function truncate(arr) {
            var newarr=arr.concat();
            newarr.pop();
            console.log(newarr);//[1,2,3]
            console.log(arr);//[1,2,3,4]
        }
        truncate([1,2,3,4]);
    </script>
function truncate(arr) {
     var newArr = arr.slice(0);
            newArr.pop();
            return newArr

}

6.在数组 arr 开头添加元素 item。不要直接修改数组 arr,结果返回新的数组

方法1.利用concat

 <script>
        function prepend(arr, item) {
            console.log([item].concat(arr));//[10,1,2,3,4]
        }
        prepend([1,2,3,4],10);
    </script>

方法2.使用push.apply

<script>
        function prepend(arr, item) {
            var newArr=[item];
            [].push.apply(newArr, arr);
            console.log(newArr)//[10,1,2,3,4]
            console.log(arr)//[1,2,3,4]
        }
        prepend([1,2,3,4],10);
    </script>

方法3.利用slice+unshift/splice    

注意:unshift()和splice()方法都会修改原数组的值,所有需要利用slice()来生成一个新的数组进行操作,从而不影响原arr数组的值

unshift() 方法可向数组的开头添加一个或更多元素,并返回新的长度。

arrayObject.unshift(newelement1,newelement2,....,newelementX)
参数描述
newelement1必需。向数组添加的第一个元素。
newelement2可选。向数组添加的第二个元素。
newelementX可选。可添加若干个元素。

 

 <script>
        function prepend(arr, item) {
            var newArr=arr.slice(0);
            newArr.unshift(item);
            console.log(newArr)//[10,1,2,3,4]
            console.log(arr)//[1,2,3,4]
        }
        prepend([1,2,3,4],10);
    </script>

splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。

arrayObject.splice(index,howmany,item1,.....,itemX)
参数描述
index必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。
howmany必需。要删除的项目数量。如果设置为 0,则不会删除项目。
item1, ..., itemX可选。向数组添加的新项目。
 <script>
        function prepend(arr, item) {
            var newArr=arr.slice(0);
            newArr.splice(0,0,item);
            console.log(newArr)//[10,1,2,3,4]
            console.log(arr)//[1,2,3,4]
        }
        prepend([1,2,3,4],10);
    </script>

方法4.普通的迭代拷贝

<script>
        function prepend(arr, item) {
            var newArr=[];
            for(var i=0;i<arr.length;i++){
                newArr.push(arr[i]);
            }
            newArr.unshift(item);
            console.log(newArr);//[10,1,2,3,4]
        }
        prepend([1,2,3,4],10);
    </script>

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

方法1.利用slice

<script>
        function curtail(arr) {
            return arr.slice(1)//[4,3,2,1]
        }
        curtail([5,4,3,2,1])
    </script>

 

方法2.利用push.apply+shift

<script>
        function curtail(arr) {
            var newArr=[];
            [].push.apply(newArr, arr);
            newArr.shift();
            return newArr
        }
        curtail([5,4,3,2,1])
    </script>

方法3.利用concat+shift

<script>
        function curtail(arr) {
            var newArr = arr.concat();
            newArr.shift();
            return newArr
        }
        curtail([5,4,3,2,1])
    </script>

方法4.普通的迭代拷贝

<script>
        function curtail(arr) {
            var newArr=[];
            for(var i=1;i<arr.length;i++){
                newArr.push(arr[i]);
            }
            return newArr;
        }
        curtail([5,4,3,2,1])
    </script>

8.合并数组 arr1 和数组 arr2。不要直接修改数组 arr,结果返回新的数组

方法1.利用concat

<script>
        function prepend(arr1,arr2) {
           return arr1.concat(arr2)//[1,2,3,4,'a','b','c',1]
        }
        prepend([1,2,3,4],['a','b','c',1]);
    </script>

方法2.利用slice+push.apply

<script>
        function concat(arr1, arr2) {
            var newArr=arr1.slice(0);
            [].push.apply(newArr, arr2);
            return newArr;
        }
        concat([1,2,3,4],['a','b','c',1]);
    </script>

方法3.利用slice+push

 <script>
        function concat(arr1, arr2) {
            var newArr=arr1.slice(0);
            for(var i=0;i<arr2.length;i++){
                newArr.push(arr2[i]);
            }
            return newArr;
        }
        concat([1,2,3,4],['a','b','c',1]);
    </script>

方法4.普通的迭代拷贝

<script>
        function concat(arr1, arr2) {
            var newArr=[];
            for(var i=0;i<arr1.length;i++){
                newArr.push(arr1[i]);
            }
            for(var j=0;j<arr2.length;j++){
                newArr.push(arr2[j]);
            }
            return newArr;
        }
        concat([1,2,3,4],['a','b','c',1]);
    </script>

9.在数组 arr 的 index 处添加元素 item。不要直接修改数组 arr,结果返回新的数组

方法1.利用slice+concat

<script>
        function insert(arr, item, index) {
            return arr.slice(0,index).concat(item,arr.slice(index));
        }
        insert([1,2,3,4],'z',2)
    </script>

方法2.利用concat +splice

 <script>
        function insert(arr, item, index) {
            var newArr=arr.concat();
            newArr.splice(index,0,item);
            return newArr//[1,2,'z',3,4]
        }
        insert([1,2,3,4],'z',2)
    </script>

方法3.利用slice+splice

<script>
        function insert(arr, item, index) {
            var newArr=arr.slice(0);
            newArr.splice(index,0,item);
            return newArr;
        }
        insert([1,2,3,4],'z',2)
    </script>

方法4.普通的迭代拷贝

<script>
        function insert(arr, item, index) {
            var newArr=[];
            for(var i=0;i<arr.length;i++){
                newArr.push(arr[i]);
            }
            newArr.splice(index,0,item);
            return newArr;
        }
        insert([1,2,3,4],'z',2)
    </script>

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

 <script>
        function count(arr, item) {
            var s=0;
            for(var i=0;i<arr.length;i++){
                if(arr[i]==item){
                    s++;
                }
            }
            return s//3
        }
        count([1,2,4,4,3,4,3],4)
    </script>

11.找出数组 arr 中重复出现过的元素

<script>
    function duplicates(arr) {
        var res=arr.sort();
        var b=[];
        for(var i=0;i<res.length;i++) {
            if (res[i] == res[i + 1] && res[i] != res[i - 1]) {
                b.push(res[i]);
            }
        }
        console.log(b)//[1,3,4]
    }
    duplicates([1, 2, 4, 4, 3, 3, 1, 5, 3]);
</script>

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

普通遍历

<script>
    function square(arr) {
        var b=[];
        for(var i=0;i<arr.length;i++){
            b.push(arr[i]*arr[i]);
        }
        console.log(b)//[1,4,9,16]
    }
    square([1,2,3,4])
</script>

使用map()

map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。

map() 方法按照原始数组元素顺序依次处理元素。

注意: map() 不会对空数组进行检测。

注意: map() 不会改变原始数组。

语法:array.map(function(currentValue,index,arr), thisValue)

参数描述
function(currentValue, index,arr)必须。函数,数组中的每个元素都会执行这个函数
函数参数:
参数描述
currentValue必须。当前元素的值
index可选。当前元素的索引值
arr可选。当前元素属于的数组对象
thisValue可选。对象作为该执行回调时使用,传递给函数,用作 "this" 的值。
如果省略了 thisValue,或者传入 null、undefined,那么回调函数的 this 为全局对象。
<script>
    function square(arr) {
        return arr.map(function(item,index,array){
            return item*item;
        })
    }
    square([1,2,3,4])
</script>

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

<script>
    function findnum(arr, target) {
        var res = [];
        for(var i = 0; i < arr.length; i++){
            if(target == arr[i])
                res.push(i);
        }
        console.log(res);//[0,4]
    }
    findnum([1,2,3,4,1,2,3],1)
</script>

14.实现一个打点计时器,要求
(1)从 start 到 end(包含 start 和 end),每隔 100 毫秒 console.log 一个数字,每次数字增幅为 1
(2)返回的对象中需要包含一个 cancel 方法,用于停止定时操作
(3)第一个数需要立即输出

<script>
    function count(start,end){
        if(start<=end){
            console.log(start);
            start++;
            time=setTimeout(function(){
                count(start,end)
            },100)
        }
        return{
            cancel:function(){
                clearTimeout(time)
            }
        }
    }
    count(1,20)
</script>

15.将数组 arr 中的元素作为调用函数 fn 的参数

输入:function (greeting, name, punctuation) {return greeting + ', ' + name + (punctuation || '!');}, ['Hello', 'Ellie', '!']

输出:Hello, Ellie!

方法1:

function argsAsArray(fn, arr) {
  return fn(arr[0],arr[1],arr[2]);
}

方法2:


function argsAsArray(fn, arr) {
  return fn.apply(fn, arr);
}
//或者
function argsAsArray(fn, arr) {
  return fn.apply(this, arr);
}

方法3:


function argsAsArray(fn, arr) {
  return fn.call(fn, arr[0],arr[1],arr[2]);
}
//或者
function argsAsArray(fn, arr) {
  return fn.call(this, arr[0],arr[1],arr[2]);
}

 

未完待续。。。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值