数组方法的使用和部分方法的重构

就目前来说,数组和对象这两种存储方式用的频率最大,而且存储数据也非常好用,下面我将列举出数组的大部分方法,并说明每一种方法的具体用法。
1、push
1.1含义:在数组末尾增加元素,可以增加多个,,改变原数组,返回值是新数组的长度。

var  arr = [1,2,5,6];
var arr1 = arr.push(1);
console.log(arr,arr1)//[1,2,5,6,1]   4  
var arr1 = arr.push(1,5,6)
console.log(arr,arr1)//[1,2,5,6,1,5,6]   7

如果说在在数组末尾增加的是一个数组,那么结果如下所示:

var arr1 = arr.push([2,5,8])
console.log(arr,arr1) //[1,2,5,6,array(3)]    5

1.2重构push

 function push(arr){
for(var i = 1;i < argument.length;i++){
arr[length] = argument[i];
  }
return arr.length;
}
push(arr,1,6,8);

2、pop
2.1含义:在数组末尾每次删除一个,注意一次只能删除一个,改变原数组,返回删除的元素,值得注意的是当数组里存储的是对象时,在删除之前需要将所有的引用设为null。

var  arr = [1,2,5,6];
var arr1 = arr.pop();
console.log(arr,arr1)//[1,2,5]   6  

2.2重构

var  arr = [1,2,5,6];
function pop(arr){
var ele = arr[length-1];
if(arr.length>0) arr.length--;
return ele;
}
push(arr);

3、unshift
3.1含义:在数组头部增加一个或多个元素,改变原数组,返回新数组的长度

var  arr = [1,2,5,6];
var arr1 = arr.unshift(1,2,3);
console.log(arr,arr1)//[1,2,3,1,2,5,6]   7

3.2重构

var  arr = [1,2,5,6];
function unshift(){
var len = arguments.length-1;
for(var i = 0;i < arr.length;i++){
arr[i + len] = arr[i];
arr[i] = null;
 }
for(var j = 1; j < arguments.length-1;j++){
arr[j-1] = arguments[j];
}
return arr.length
}
unshift(arr,1,4,7);

4、shift
4.1含义:在数组头部每次删除一个元素,改变原数组,返回的是删除的元素

var  arr = [1,2,5,6];
var arr1 = arr.shift();
console.log(arr,arr1)//[2,5,6]   1

4.2重构

function shift(arr){
var ele = arr[0];
for(var i = 0;i < arr.length;i++){
arr[i-1] = arr[i];
}
if(arr.length>0) arr.length--;
return ele;
}
shift(arr);

5、join
5.1含义:连接符,将数组的元素以某一个字符连接成一个字符串,默认以","连接,不改变原数组。

var  arr = [1,2,5,6];
var arr1 = arr.join();
console.log(arr1)//1,2,5,6
var arr1 = arr.join("+");
console.log(arr1)//1+2+5+6

5.2重构join

function join(arr,separator){
if(separator === undefined) separator = ",";
var separator = string(separator);
var str = "";
for(var i = 0; i < arr.length;i++){
if(!arr[arr.length-1])  str += arr[i] + separator ;
else str+=arr[i];
}
return str;
}

6、concat
6.1含义:数组连接多个数组,也可以连接单个元素,返回一个新连接完的数组,不改变原数组,与原数组无引用关系,引用关系我这里就不具体说了,总之它和引用数据类型有关。

var  arr = [1,2,5,6];
var arr1 = arr.concat(1);
console.log(arr1);// [1,2,5,6,1]
var arr1 = arr.concat([2,8,9]);
console.log(arr1);// [1,2,5,6,2,8,9]

当然也可用此方法复制数组
var arr1 = arr.concat();
6.2重构

function concat(arr){
var arr1 = [];
for(var i = 0;i < arr.length;i++){
arr1[i] = arr[i];
}
if(arguments.length===1) return arr1;
for(var j = 1;j<arguments.length;j++){
if(arguments[j]!==null && arguments[j].constructor===Array){
for(var k = 0;k<arguments[j].length;k++){
arr1[arr1.length] =arguments[j][k];
}
}else{
arr1[arr1.length] = arguments[j];
}
}
return arr1;
}

7、splice
7.1含义
分为三种情况:1、当splice只含有一个参数时(参数为正数),表示从此位置一直删除到数组末尾,返回删除的元素组成的新数组,此方法会改变原数组;

 var  arr = [1,2,5,6];
 var arr1 = arr.splice(2);
 console.log(arr,arr1);//[1,2]  [5,6]

当参数为负值时,表示从右向左到第几个,并从此位置向右删除到数组末尾。

 var  arr = [1,2,5,6];
 var arr1 = arr.splice(-3);
 console.log(arr,arr1);//[1]  [2,5,6]

2、当splice有两个参数时(splice(m,n)),表示从m删除n个元素,也就是说第一个参数代表某个位置,第二个是要删除的个数。

 var  arr = [1,2,5,6];
 var arr1 = arr.splice(1,2);
 console.log(arr,arr1);//[1,6]  [2,5]

说明:如果第一个参数为负数时(splice(-m,n)),表示从右往左数到m个位置,并从m位置向右删除n个元素,返回删除的元素组成的数组。

 var  arr = [1,2,5,6];
 var arr1 = arr.splice(-2,2);
 console.log(arr,arr1);//[1,2]  [5,6]

3、当splice有三个参数时(splice(m,n,k)),表示从m位置删除n个元素之后,插入k,k不止一个,可能有多个。

var  arr = [1,2,5,6];
var arr1 = arr.splice(1,arr.length,0,-1,-2);//表示从数组下标为1的元素一直删除到数组末尾,再将0,-1,-2插进去。
console.log(arr,arr1);//[1,0,-1,-2]  [2,5,6]  

注意:var arr1 = arr.splice(0)
将一个数组的所有元素转移到另一个数组,不是复制。
var arr1 = arr.splice() 没有删除返回空数组
说明:此方法的重构作为练习,通过1、2、3三部分相信我讲的应该够清楚,按照所列举的功能依次判断去实现它,不过呢如果有同学通过我写的思路还是构造不出来的话,下方留言,第一时间会回复哦。
8、slice
8.1含义:1、当参数只有一个时slice(m),表示从从下标为m的元素一直截取到数组末尾,改变原数组,返回截取到的元素组成的修数组。

 var  arr = [1,2,5,6];
var arr1 = arr.slice(1);
console.log(arr,arr1);//[1]  [2,5,6]

2、当有两个参数时slice(m,n),表示截取从下标为m的元素开始到下标为n的元素之前,不包括最后一项。

var  arr = [1,2,5,6];
var arr1 = arr.slice(1,3);
console.log(arr,arr1);//[1,6]  [2,5]

注意:var arr1 = arr.slice()//复制原数组到新数组,没有引用关系
var arr1 = arr.slice(0)//复制数组
8.2重构

function slice(arr,start,end){
if(start === undefined) start=0;
if(end === undefined) end = arr.length;
start = Number(start);
end =  Number(end);
if(!isNaN(end) && isNaN(start)) start=0;
if(isNaN(start))  return [];
if(start < 0) start = arr.length + start;
if(start < 0) start = arr.length + end;
var arr1 = [];
for(var i = start;i < end;i++){
arr1[i - start] = arr[i];
}
return  arr1;
}

说明:以上条件有缺乏的或者小编考虑不周的可以给小编留言哦!
9、some、every
9.1some:原意是指某些,在这里的含义是当数组中的元素有满足条件的就返回true,否则就返回false;

var  arr = [1,2,5,6];
var arr1 = arr.some(function(item){
return  item>2;
})
console.log(arr1);//true

9.2every:原意是指每一个,在这里的含义是当数组中的所有元素满足条件的就返回true,否则就返回false;

var  arr = [1,2,5,6];
var arr1 = arr.every(function(item){
return  item>2;
})
console.log(arr1);//false

重构some(使用桥接模式),every重构和some类似

function fn(item,index,arr){
return item>2;
}
function some(arr,fn){
for(var i = 0; i < arr.length;i++){
if(i in arr && fn(arr[i],i,arr)) return true;
}
return false;
}

10、indexOf 、lastindexOf
10.1含义:如果只有一个参数时,就查找该元素的索引,如果找到则返回该元素所在的下标,没找到则返回-1;

var  arr = [1,2,5,6];
var index = arr.indexOf(1);
console.log(index);//0

如果只有二个参数时(indexOf(m,n)),查找m元素的索引,不过是从下标为n的元素开始查找,如果找到则返回该元素所在的下标,没找到则返回-1;

var  arr = [1,2,5,6];
var index = arr.indexOf(1,2);
console.log(index);//-1 找不到
重构indexOf
function indexOf(arr,search,index){
if(index === undefined) index = 0;
for(var i = index; i < arr.length; i++){
if(arr[i] == search)  return i;  
}
return -1;
}

lastindexOf用法和indexOf类似,就不再详解了。
11、fill
11.1含义:fill有三个参数,fill(m,n,k),m是要填充的值,n是起始位置,k是结束位置,如果不给开始位置和结束位置,就会全部填充覆盖。
var arr = Array(6).fill(10)
var arr = Array(6).fill({a:1})
注意:fill只能用于有长度的数组,而且如果填充的元素是对象时,是有引用关系的,当改变其中一个元素时,其它的都会变,例子可以自己写写看。
12、
12.1 forEach
arr.forEach(function(item,index,arr){});
有三个参数:item是数组中的每一个元素,index是数组元素的下标,arr就是原数组。
遍历数组时,forEach相比较for循环来说不会遍历到空元素,相比较for-in不会遍历到数组的属性,有同学可能会问数组也有属性?对的,数组也是对象。
12.2 map
arr.map(function(item,index){})
说明:将满足条件的元素形成一个新数组,使用return返回,并且新数组的长度和原数组相同。
13、filter、reduce
含义:过滤和归并

 var arr = [1,8,3,4,5,6];
        var arr1 = arr.filter(function(item,index,arr){
            return item > 3;
        });
        console.log(arr1); 

说明:filter 返回的是满足条件的值组成的数组
reduce:reduce有四个参,value如果不给初始值,那么value就是数组的第一个元素,并且遍历数组时会从下标为1的元素开始;如果value有初始值,那么数组将会从第一个元素开始遍历。

//计算数组元素的和
  var arr=[1,2,3,4,5,6,7];
        var sum = arr.reduce(function(value,item,index,arr){
           console.log(value,item,index);             
            return value+=item;
        }) 
//找数组中元素的最大值或最小值。
  var arr=[1,2,3,4,5,6,7];
        var max = arr.reduce(function(value,item){
            return value > item ? value:item;
           //  return value < item ? value:item;
        })
        console.log(max); 

13、使用while、for、indexOf完成数组去重

var arr=[1,3,3,6,8,2,3,5,6,3,7,9,8,3,6,7,3,8,9];
for(var i = 0; i < arr.length;i++){
var index = i;
while(index > -1){
index = arr.indexOf(arr[i],index+1);
if(index > -1)  delete arr[i]
}
}

说明:使用delete会使得数组变为松散型结构,什么是松散型我会在后面讲解。
以上有不足的,还请指正!

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