美文网首页
javascript的语法自测(数组)

javascript的语法自测(数组)

作者: 进击的前端 | 来源:发表于2016-07-23 23:47 被阅读120次

    牛客网上面有一个关于js的自测,然后我看了一下原作者的github,记录一下解题过程吧。
    所以,对数组操作,不改变原来数组的方法,concat,slice,
    改变原来数组的方法,splice,pop,shift,push,unshift

    1. 找出元素 item 在给定数组 arr 中的位置
      我的答案
    function indexOf(arr, item) {
        for(var i=0;i<arr.length;i++){
            if(arr[i]=== item){
                return i;
            }
        }
        return -1
    }
    

    原作者给出的答案。

    indexOf: function(arr, item) {
    
      /*
      if (Array.prototype.indexOf) { return arr.indexOf(item); }
      */
    
      for (var i = 0, len = arr.length; i < len; i++) {
        if (arr[i] === item) {
          return i;
        }
      }
    
      return -1;
    },
    

    这里面有一行被注释,如果这个方法存在的话,那么直接返回这个方法,否则使用重新定义的方法。还有一个是提前计算数组的长度,这样可以提高效率。

    1. 数组求和
      我的答案
    function sum(arr) {
        var sum = 0;
        for(var i =0,len=arr.length;i<len;i++){
            sum = sum + arr[i];
        }
        return sum;
    }
    

    原作者给出的答案

      sum: function(arr) {
        var sum = 0;
    
        for (var i = 0, len = arr.length; i < len; i++) {
          sum += arr[i];
        }
    
        return sum;
      },
    
    1. 移除元素,返回新数组
      我的答案
    function remove(arr, item) {
        var new_arr = [];
        for(var i=0,len = arr.length;i<len;i++){
            if(arr[i]!==item){
                new_arr.push(arr[i]);
            }
        }
        return new_arr;
    }
    

    原作者

    remove: function(arr, item) {
      var ret = [];
    
      for (var i = 0, len = arr.length; i < len; i++) {
        if (arr[i] !== item) {
          ret.push(arr[i]);
        }
      }
    
      return ret;
    },
    
    1. 移除数组元素不要拷贝
      移除数组 arr 中的所有值与 item 相等的元素,直接在给定的 arr 数组上进行操作,并将结果返回
      我的解法
    function removeWithoutCopy(arr, item) {
        for(var i=arr.length-1;i>=0;i--){
            if(arr[i]===item){
               arr.splice(i,1);
            }
         
        }
        return arr;
    }
    

    原作者

    removeWithoutCopy: function(arr, item) {
      var i;
      var len;
    
      for (i = 0, len = arr.length; i < len; i++) {
        if (arr[i] === item) {
          arr.splice(i, 1);
          i--;
          len--;
        }
      }
    
      return arr;
    },
    

    好吧,我觉得我的方法更好。

    1. 添加元素
      在数组 arr 末尾添加元素 item。不要直接修改数组 arr,结果返回新的数组
    function append(arr, item) {
        var new_arr = [];
         
        for(var i=0;i<arr.length;i++){
            new_arr.push(arr[i]);
         
        }
        new_arr.push(item);
        return new_arr;
    }
    

    看到有一些关于数组的操作,其中concat是不改变原数组的

    function append(arr, item) {
        // return arr.push(item);
        return arr.concat([item]);
    }
    

    另外或者利用slice来复制数组

    function append(arr, item) {
      var a = arr.slice(0);
      a.push(item);
      return a;
    }
    

    原作者给的答案,应该是歧义吧

    append: function(arr, item) {
      arr.push(item);
      return arr;
    }
    
    1. 删除数组第一个元素
    function curtail(arr) {
        return [].concat(arr).slice(1);     
    }
    

    当时没想到,slice也是复制数组的,所以应该是

    function curtail(arr) {
        return arr.slice(1);     
    }
    

    与上题一样,作者给出来的是改变数组的

    truncate: function(arr) {
        arr.pop();
        return arr;
    },
    
    1. 数组合并
      合并数组 arr1 和数组 arr2。不要直接修改数组 arr,结果返回新的数组
      我的,我以为要自己原生态实现。
    function concat(arr1, arr2) {
     return arr1.concat(arr2);
    }
    

    作者的

    concat: function(arr1, arr2) {
      return arr1.concat(arr2);
    }
    
    1. 添加元素
      在数组 arr 的 index 处添加元素 item。不要直接修改数组 arr,结果返回新的数组
      先用slice拷贝数组,再用splice来添加元素.
    function insert(arr, item, index) {
        var b = arr.slice(0);
        b.splice(index,0,item);
        return b;
    }
    

    原作者不拷贝

    insert: function(arr, item, index) {
      arr.splice(index, 0, item);
      return arr;
    }
    
    1. 计数
    function count(arr, item) {
        var cc = 0;
        for(var i=0;i<arr.length;i++ ){
            if(arr[i]===item){
                  cc+=1;
            }
        }
        return cc;
    }
    

    作者

    count: function(arr, item) {
      var count = 0;
      for (var i = 0, len = arr.length; i < len; i++) {
        if (arr[i] === item) {
          count++;
        }
      }
      return count;
    }
    
    1. 查找重复元素
      找出数组 arr 中重复出现过的元素
    function duplicates(arr) {
        var cc={};
         
        var new_arr = [];
         
        for(var i=0;i<arr.length;i++){
             
            arr[i] in cc?cc[arr[i]]=cc[arr[i]]+1:cc[arr[i]] = 1;
        }
        for(key in cc){
             
            if(cc[key]>1){
                new_arr.push(key);
            }
        }
        return new_arr;
    }
    
    duplicates: function(arr) {
        var seen = {};
        var dupes = [];
    
        for (var i = 0, len = arr.length; i < len; i++) {
          seen[arr[i]] = seen[arr[i]] ? seen[arr[i]] + 1 : 1;
        }
    
        for (var item in seen) {
          if (seen.hasOwnProperty(item) && seen[item] > 1) {
            dupes.push(item);
          }
        }
    
        return dupes;
      },
    

    作者直接用seen[arr[i]]来表示存在与否,好吧我表示 保留意见,在这题里面是没有问题的。但是hasOwnProperty来判断熟悉也是应该的。

    1. 求二次方
      为数组 arr 中的每个元素求二次方。不要直接修改数组 arr,结果返回新的数组
    function square(arr) {
        return arr.map(function(item){
            return item*item;
        })
    }
    
    square: function(arr) {
       var ret = [];
    
       for (var i = 0, len = arr.length; i < len; i++) {
         ret.push(arr[i] * arr[i]);
       }
    
       return ret;
     },
    
    1. 查找元素位置
    function findAllOccurrences(arr, target) {
        var res=[];
        for(var i=0,len = arr.length;i<len;i++){
            if(arr[i]===target){
                res.push(i);
            }
        }
        return res;
    }
    
    findAllOccurrences: function(arr, target) {
      var ret = [];
    
      for (var i = 0, len = arr.length; i < len; i++) {
        if (arr[i] === target) {
          ret.push(i);
        }
      }
    
      return ret;
    }
    

    相关文章

      网友评论

          本文标题:javascript的语法自测(数组)

          本文链接:https://www.haomeiwen.com/subject/wkyxjttx.html