常见数组方法以及的封装

定义数组:

        var arr = [];  
        var arr1 = new Array();  
        var arr2 = new Array(3);  
        var arr3 = new Array(1, 2, 354);  
        console.log(arr)    //[]
        console.log(arr1)   //[]
        console.log(arr2)   //[empty × 3]
        console.log(arr3)   //[1, 2, 354]


        //数组的长度  (从尾部删除元素)
        var arr = [1, 2, 3, 4];        
        console.log(arr.length = 2);  //长度为2
        console.log(arr)  //[1, 2]



        // 数组转字符串 (每一项逗号隔开)
        var arr = [1, 2, 3, 4];
        console.log(arr.toString())  //字符串 1,2,3,4
        console.log(arr.toLocaleString())  ////字符串 1,2,3,4


        // 字符串转数组  (参数为分割符  分隔符可为空字符串,用字间距做分割)
        var arr = '1, 2, 3, 4';
        console.log(arr.split())  //数组["1, 2, 3, 4"]
        console.log(arr.split(' '))  //数组 ["1,", "2,", "3,", "4"]


        //将数组中所有元素转为字符串连接到一起,返回最后生成的字符串  (默认逗号拼接  拼接符)
        var arr = [1, 2, 3, 4];
        console.log(arr.join())  //字符串 1,2,3,4
        console.log(arr.join(' '))   //字符串 1 2 3 4


        // 数组的反转 (会改变原数组)
        console.log(arr.reverse())  //[4, 3, 2, 1] 
        

        //数组的排序
        var arr = [1, 3, 5, 4];
        console.log(arr.sort(function(a, b){
            // return a - b    //从小到大 [1, 3, 4, 5]
            return b - a    //从大到小 [5, 4, 3, 1]
        }))



        //拼接数组  不会改变原数组 ,返回一个新的数组
        var arr = [1, 2, 3, 4];
        var arr1 = [2, 3, 4, 5]
        console.log(arr.concat(arr1))  //[1, 2, 3, 4, 2, 3, 4, 5]


        //通过元素找下标
        var arr = [1, 2, 3, 4];
        // 从前往后找
        console.log(arr.indexOf(3))  //2
        console.log(arr.indexOf(1, 2))  //-1
        // 第一个参数: 需要查找的元素
        // 第二个参数:起始下标(从某个下标开始找)
        // 找不到返回-1

        // 从后往前找
        // console.log(arr.lastIndexOf(1,2))


        // 数组的截取方法
        var arr = [1, 2, 3, 4];
        console.log(arr.slice(1))  //[2, 3, 4]
        //传入一个参数 截取的起始值
        //返回截取后的数组
        //不会改变原数组



        //插入新元素
        var arr = [1, 2, 3, 4];        
        console.log(arr.splice(2, 0, 5));
        console.log(arr);  //[1, 5, 2, 3, 4]
        // 第一个参数:起始下标
        // 第二个参数:删除元素个数
        // 第三个参数:需要插入的元素
        // 会改变原数组

push:
1 封装一个函数,这个函数的名字叫做 push
2 这个函数的参数,第一个是一个数组,第二个以后是任意的数据
3 调用这个函数,那么会把第二个以后的所有参数,依次放到第一个参数也就是那个数组的最后一个位置。
4 这个函数返回值,是放入这些数据之后数组的长度。

var arr = ['a','b','c'];
function push(arr){
    var arg = arguments;
    for(var i = 1; i<arg.length; i++){
        arr[arr.length] = arg[i];
    }
    return arr;
}

push(arr,1,2,3)
console.log(arr); // (6) ["a", "b", "c", 1, 2, 3]

封装 unshift(向第一个添加)

1 封装一个函数,这个函数的名字叫做 unshift
2 这个函数的参数,第一个是一个数组,第二个以后是任意的数据 * 3 调用这个函数,那么会把第二个以后的所有参数,依次放到第一个参数也就是那个数组的开头的位置。
3 这个函数返回值,是放入这些数据之后数组的长度。

    function unshift(arr){
      var arg = arguments, len = arg.length;

      for(var j=1; j<len; j++){
        for(var i=arr.length; i>0; i--){
          arr[i] = arr[i-1];
        }
        arr[0] = arg[j];
      }

      return arr.length;
    }
    var arr = [1, 2, 3];
    console.log(unshift(arr, 'a', 'b', 'c', 'd'));
    console.log(arr);
    // ===> [1, 1, 2, 3];
    // for(var i=arr.length; i>0; i--){
    //   arr[i] = arr[i-1];
    // }
    // arr[3] = arr[2] ==> [1, 2, 3, 3];
    // arr[2] = arr[1] ==> [1, 2, 2, 3];
    // arr[1] = arr[0] ==> [1, 1, 2, 3];
    // arr[0] = 4;   // ===> [4, 1, 2, 3]
    // 
    // console.log(arr);

pop(删除最后一个)

1 封装一个函数,名字叫做pop
2 pop函数的参数是唯一的数组
3 调用pop函数,删除数组中最后一个数据
4 如果这个数组是空,那么调用这个函数,返回值是 undefined
5 如果不是空数组返回值为被删除的数据

    // var arr = [1, 2, 3];
    function pop(arr){
      var len = arr.length, last = arr[len-1];
      if(!len) return;
      arr.length--;
      return last;
    }
    // console.log(pop(arr));  // 3
    // console.log(arr); // [1, 2]

shift (删除第一个)

1 封装一个函数,名字叫做 shift
2 shift函数的参数是唯一的数组
3 调用shift函数,删除数组中第一个数据
4 如果这个数组是空,那么调用这个函数,返回值是 undefined
5 如果不是空数组返回值为被删除的数据

function shift(arr){
  var len = arr.length, first = arr[0];
  if(!len) return;
  for(var i=0; i<len-1; i++){
    arr[i] = arr[i+1];
  }
  arr.length--;
  return first;
}
var arr = ['a', 'b', 'c'];

console.log(shift(arr));  // 'a'
console.log(arr);  // ['b', 'c']

indexOf

1 封装一个函数叫 indexOf
2 indexOf 函数的第一个参数为要查找的数组,第二个参数为要查找的数据
3 调用这个函数,如果要查找的数据未找到,那么函数的返回值为-1,如果找
到那么返回这个数据的位置

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

var arr = [1, 2, 'a', 4];

console.log(indexOf(arr, 'a'));  // 2
console.log(indexOf(arr, 10));  // -1

spliceOne

1 封装一个函数叫做 spliceOne
2 该函数的第一个参数是数组,第二个参数是索引
3 调用这个函数,可以删除这个索引对应的数据
4 如果是空数组,那么返回undefined,否则返回这个被删除的数据

    function spliceOne(arr, index){
      var len = arr.length, ret = arr[index];
      if(!len) return;
      for(var i=index, j=i+1; j<len; i++,j++){
        arr[i] = arr[j];
      }
      arr.length--;
      return ret;
    }

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

    console.log(spliceOne(arr, 2));  // 3
    console.log(arr);  // [1, 2, 4];

join(将数组转换成字符串)

1 封装一个函数叫做 join
2 join函数的第一个参数是一个数组,第二个参数是分割符
3 调用join,那么数组中的每一项就会被指定的分割符链接起来,如果不指定分隔符,默认就是 ‘,’,如果分隔符传入的不是一个字符串,那么就返回false
4 返回值为字符串,原数组不变。

function join(arr, spliter){
  if(typeof spliter === 'undefined'){
    return arr.toString();
  }
  if(typeof spliter !== 'string'){
    return false;
  }
  for(var i=0, str='', len = arr.length; i<len; i++){
    str += i<len-1 ? arr[i] + spliter : arr[i];
  }
  return str;
}

var arr = [1, 2, 3];

console.log(join(arr));  // '1,2,3'
console.log(join(arr, '')); // '123'
console.log(join(arr, '--'));  //'1--2--3';
console.log(join(arr, 123));  // false
console.log(arr); // [1, 2, 3];

reverse(反转)

1 封装一个函数叫做reverse
2 该函数的参数是一个数组
3 调用这个函数,那么数组将会反转
4 返回反转后的数组

    function reverse(arr){
      var len = arr.length;
      if(len < 2) return arr;
      for(var i=0; i<len; i++){
        var indexA = i;
        var indexB = len - i - 1;
        if(indexA < indexB){
          var middle = arr[indexA];
          arr[indexA] = arr[indexB];
          arr[indexB] = middle;
        }
      }
      return arr;
    }

    var arr = [1, 2, 3];

    console.log(reverse(arr));  // [3, 2, 1]
    console.log(arr);  // [3, 2, 1]

filter

1 封装一个函数叫做filter
2 该函数的第一个参数是要过滤的数组,第二个参数是一个函数成为过滤函数
3 调用这个方法,会对数组进行遍历
4 每次遍历,都会把数组的当前这项和索引值当作参数传给过滤函数
5 这个过滤函数的规则一旦符合就返回这个值
6 filter函数最终返回所有符合条件的数据的集合,一个新数组。

    function push(arr){
      var arg = arguments, len = arg.length;
      for(var i=1; i<len; i++){
        arr[arr.length] = arg[i];
      }
      return arr.length;
    }

    function filter(arr, cb){
      var result = [], len = arr.length;
      for(var i=0; i<len; i++){
        var ret = cb(arr[i], i);
        if(ret){
          push(result, arr[i]);
        }
      }
      return result;
    }

    var arr = [11, 4, 7, 12, 17, 9];

    var result = filter(arr, function (item, i){
      console.log(i);
      return item > 10;
    });

    console.log(result);  // [11, 12, 17];

封装简单的css 函数

1 封装一个函数名字叫做css
2 这个函数的参数有3个,对应:元素、元素的样式、样式对应的值
3 如果只传前2个参数,那么是获取元素的样式,如果传了3个参数,那么是设置这个元素对应的样式。

  'width',
  'height',
  'left',
  'top',
  'bottom',
  'right',
  'marginLeft',
  'marginTop',
  'marginBottom',
  'marginRight'
];
var box = document.querySelector('.box');
function indexOf(arr, item){
  for(var i=0,len=arr.length; i<len; i++){
    if(arr[i] === item){
      return i;
    }
  }
  return -1;
}

function css(ele, attr, val){
  // 如果attr是一个字符串并且val不存在,那么才是获取某个属性对应的值
  if(typeof val === 'undefined'){
    var ret = getComputedStyle(ele)[attr];

    // return indexOf(normalAttr, attr) !== -1 ? parseFloat(ret) : ret * 1 === ret * 1 ? ret*1 : ret;

    if(indexOf(normalAttr, attr) !== -1){
      return parseFloat(ret);
    }else{
      return ret * 1 === ret * 1 ? ret * 1 : ret;
    }

  }

  function setAttr(attr, val){
    if(indexOf(normalAttr, attr) !== -1){
      ele.style[attr] = val + 'px';
    }else{
      ele.style[attr] = val;
    }
  }

  // 批量设置
  if(typeof attr === 'object'){
    for(var key in attr){
      setAttr(key, attr[key]);
    }
    return;
  }

  setAttr(attr, val);
}
css(box,'background','yellow');
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,193评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,306评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,130评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,110评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,118评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,085评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,007评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,844评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,283评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,508评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,395评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,985评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,630评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,797评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,653评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,553评论 2 352

推荐阅读更多精彩内容