JS一些常用数组处理方法

考虑到实际应用中多数为引用(复杂)类型数据,所以方法解析中部分包含引用(复杂)类型数据的测试效果

1、array.concat()

连接两个数组,返回值是连接后的新数组
当这个数组内部是引用(复杂)数据类型的时候,这个方法并不会在内存开辟新的区域。所以并不能实现深层次拷贝的效果

// 基础数据类型测试 
let a = [1,2,3];
let b = a.concat([4,5]); 
b[0] = 9;
console.log(a); // [1, 2, 3]
console.log(b); // [9,2,3,4,5]

// 引用(复杂)数据类型测试  
let d = [{color:'red'},{color:'blue'}]; 
let e = d.concat([{color:'green'}]);
e[0].color = 'yellow'; 
console.log(d); // [{color:'yellow'},{color:'blue'}]
console.log(e); // [{color:'yellow'},{color:'blue'},{color:'green'}]

2、array.push()

在数组后面追加内容,返回值是追加内容后数组的长度
该方法改变原数组

let a = [10,20,30,40];
let b = a.push(50);
console.log(a); // [10,20,30,40,50]
console.log(b) // 5
console.log(b == a.length); // true
// 引用(复杂)数据类型测试 
let c = [{id:1,color:'red'},{id:2,color:'green'}];
c.push({id:3,color:'blue'});
console.log(c); // [{id:1,color:'red'},{id:2,color:'green'},{id:3,color:'blue'}]

// 扩展  测试 
let e = [1,2,3,4];
e.push([5,6],7,8);
console.log(e); // [1,2,3,4,[5,6],7,8];

let f = [{id:1,color:'red'},{id:2,color:'green'}];
f.push('blue','yellow',{id:3,color:'black'})
console.log(f); // [{id:1,color:'red'},{id:2,color:'green'},'blue','yellow',{id:3,color:'black'}]
            
// 单次push操作 不限 追加内容数据类型与长度

3、array.unshift()

在数组前面插入内容,返回值是插入内容后数组的长度
该方法改变原数组

// 基础数据类型测试 
let a = [10,20,30,40];
let b = a.unshift(50);
console.log(a); // [50,10,20,30,40]
console.log(b) // 5
console.log(b == a.length); // true 

// 引用(复杂)数据类型测试 
let c = [{id:1,color:'red'},{id:2,color:'green'}];
c.unshift({id:3,color:'blue'});
console.log(c); // [{id:3,color:'blue'},{id:1,color:'red'},{id:2,color:'green'}]

// 扩展  测试 
let e = [1,2,3,4];
e.unshift([5,6],7,8);
console.log(e); // [[5,6],7,8,1,2,3,4];

let f = [{id:1,color:'red'},{id:2,color:'green'}];
f.unshift('blue','yellow',{id:3,color:'black'})
console.log(f); // ['blue','yellow',{id:3,color:'black'},{id:1,color:'red'},{id:2,color:'green'}]
            
// 单次unshift操作 不限 插入内容数据类型与长度

4、array.splice(index,number,item...)

替换数组中的元素,返回值是被替换的元素集合
index:需要操作元素的索引值 (必填)
number:从索引值开始需要删除的长度 (必填)
item...:需要替换的元素内容,不填则执行删除操作(选填)
number 填 0 为插入操作、不传入 item.. 为删除操作
该方法改变原数组

// 替换操作
let a = [1,2,3,4,5,6,7];
console.log(a.splice( 2, 3, ...[30,40,50] )); // [3,4,5]
console.log(a); // [1, 2, 30, 40, 50, 6, 7]

// 插入操作
let b = [1,2,3,4,5,6,7];
console.log(b.splice(2,0, ...['A','B','C'])); // []
console.log(b); // [1, 2, 'A', 'B', 'C', 3, 4, 5, 6, 7]

// 删除操作
let c = [1,2,3,4,5,6,7];
console.log(c.splice( 2, 3 )); // [3,4,5]
console.log(c); // [1, 2, 6, 7] 

5、array.slice(start,end)

切出数组中的元素,返回值是被切出的元素集合
start:要切出元素起始位置的索引值
end:要切出元素结束位置的索引值(选填 )
不传入 end 索引位置,则默认为从 start 索引位置之后的所有元素
不包含 end 索引位置元素

let a = [1,2,3,4,5,6,7];
console.log(a.slice( 2,4)); // [3, 4]
console.log(a); // [1, 2, 3, 4, 5, 6, 7]

let b = [1,2,3,4,5,6,7];
console.log(b.slice(2)); // [3, 4, 5, 6, 7]
console.log(b); // [1, 2, 3, 4, 5, 6, 7]

6、array.toString()

将简单数组转为字符串类型
值得注意的是它会拉平数组的所有层级,但是无法正确解析 对象 object

let a = [1,2,3,4,5,6,7];
console.log(a.toString()); // 1,2,3,4,5,6,7

let b = ['red','green','blue'];
console.log(b.toString()); // red,green,blue

let c = [1,[0.2,0.3],2,['A','B',['c','d']],true,[true,false]];
console.log(c.toString()); // 1,0.2,0.3,2,A,B,c,d,true,true,false

let d = [{id:1,color:'red'},1,2,3,'A','B','C'];
console.log(d.toString()); // [object Object],1,2,3,A,B,C

7、array.split(sep,limit)

将字符串转为数组,返回值为转化后的数组
sep:以传入的符号作为标记,来分隔数组单个元素的组成部分
limit:指定返回的数组的最大长度

let a = 'AB-CD';
// 传入对应符号
console.log(a.split('-')); // ['AB', 'CD']
// 传入空字符
console.log(a.split('')); // ['A', 'B', '-', 'C', 'D']
// 传入字符串中不存在的符号
console.log(a.split('/')); // ['AB-CD']
// 传入空字符 且 设置最大长度
console.log(a.split('',3)); // ['A', 'B', '-']

8、array.filter()

对数组进行过滤操作,返回满足表达式的元素集合

// 简单数组
let a = [1,2,3,4,5,6,7,8]; 
console.log(a.filter((value,index)=>{ return value > 5  })); // [6, 7, 8]

// 对象数组 
let b = [{id:1,color:'red'},{id:1,color:'green'},{id:2,color:'blue'}];
console.log(b.filter((value,index)=>{ return value.id == 1  })); // [{id:1,color:'red'},{id:1,color:'green'}]

9、array.find()

查找当前数组,返回第一个满足表达式的元素

// 简单数组
let a = [1,2,3,4,5,6,7,8]; 
console.log(a.find((value,index)=>{ return value > 5  })); // 6

// 对象数组 
let b = [{id:1,color:'red'},{id:2,color:'blue'},{id:2,color:'green'}];
console.log(b.find((value,index)=>{ return value.id == 2  })); // {id:2,color:'blue'}

10、array.findIndex()

查找当前数组,返回第一个满足表达式元素的索引值

// 简单数组
let a = [1,2,3,4,5,6,7,8]; 
console.log(a.findIndex((value,index)=>{ return value > 5  })); // 5

// 对象数组 
let b = [{id:1,color:'red'},{id:2,color:'blue'},{id:2,color:'green'}];
console.log(b.findIndex((value,index)=>{ return value.id == 2  })); // 1

11、array.indexOf(value)

根据value检索当前数组或字符串内容,返回检索到第一次出现的索引值;不存在返回 -1
value:需要做检索的字符
该方法只能检索基础数据类型

// 字符串
let str = 'A B C D E F';  
console.log(str.indexOf('E'));  // 8

// 简单数组
let a = [1,2,3,4,5,6,7,8];  
console.log(a.indexOf(5));  // 4 

// 嵌套数组
let b = [1,2,3,4,[5,6],7,8];  
console.log(b.indexOf(5));  // -1 

12、array.includes(value)

根据value检索当前数组或字符串内容;存在返回true 不存在返回false
value:需要做检索的字符
该方法只能检索基础数据类型

// 字符串
let str = 'A B C D E F';  
console.log(str.includes('E'));  // true

// 简单数组
let a = [1,2,3,4,5,6,7,8];  
console.log(a.includes(5));  // true 

// 嵌套数组
let b = [1,2,3,4,[5,6],7,8];  
console.log(b.includes(5));  // false 

13、array.every()

遍历数组,判断数组元素内容是否满足表达式;全部满足返回 true

// 简单数组
let a = [1,2,3,4,5,6,7,8];  
console.log( a.every((value,index) => {return value > 0 }) );  // true 
console.log( a.every((value,index) => {return value > 2 }) );  // false 
 
// 对象数组
let b =  [{id:1,color:'red'},{id:2,color:'blue'},{id:2,color:'green'}];
console.log( b.every((value,index) => {return value.color != '' }) );  // true 
console.log( b.every((value,index) => {return value.color == 'green' }) );  // false 

14、array.some()

遍历数组,判断数组元素内容是否满足表达式;其中至少有一个满足返回 true

// 简单数组
let a = [1,2,3,4,5,6,7,8];  
console.log( a.some((value,index) => {return value > 7 }) );  // true 
console.log( a.some((value,index) => {return value > 10 }) );  // false 
 
// 对象数组
let b =  [{id:1,color:'red'},{id:2,color:'blue'},{id:2,color:'green'}];
console.log( b.some((value,index) => {return value.color == 'green'  }) );  // true 
console.log( b.some((value,index) => {return value.color == 'yellow' }) );  // false 

15、array.sort()

将数组进行排序处理

let a = [50,10,20,6,7,8,90];  
a.sort();
console.log(a); // [10, 20, 50, 6, 7, 8, 90]

let b =  ['Z','Y','X','A','B','C'];
b.sort();
console.log(b); // [ A, B, C, X, Y, Z]

let c =  [{id:3,value:'B'},{id:1,value:'D'},{id:2,value:'C'},{id:4,value:'A'}];
c.sort(); 
console.log(c);  // [{id:3,value:'B'},{id:1,value:'D'},{id:2,value:'C'},{id:4,value:'A'}]

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

推荐阅读更多精彩内容

  • 1、push()向数组的末尾添加新内容参数:要添加的项。传递多个用逗号隔开,任何数据类型都可以返回值:新增后数组的...
    师妹悠着点阅读 170评论 0 0
  • 一.Array对象方法 Array 对象方法 .concat()[https://segmentfault.com...
    Angel_6c4e阅读 635评论 0 0
  • 1.join() (数组转字符串) 数组转字符串,方法只接收一个参数:即默认为逗号分隔符()。 vararr=[1...
    GuessYe阅读 162评论 0 0
  • 1、join() (数组转字符串) 数组转字符串,方法只接收一个参数:即默认为逗号分隔符()。 join()实现重...
    _皓月__阅读 293评论 0 1
  • filter、map、forEach filter filter() 方法创建一个新的数组,新数组中的元素是通过检...
    空岛空心阅读 256评论 0 0