常见数组操作(js)前端向

1. 数组插入、添加

参考链接:https://segmentfault.com/a/1190000016503330 部分方法说明参考该篇文章

1. push()

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

2. unshift()

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

3. arr[length]添加

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

4. arr.splice(x, y, z)

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

5. concat()

var arr1 = [1, 2, 3, 4, 5];
var arr2 = [6,7,8,9]
var newArr = arr1.concat(arr2);
console.log(newArr); // [1, 2, 3, 4, 5, 6,7,8,9];

6. 使用 … 扩展运算符合并元素

var arr = [1, 2, 3, 4, 5];
arr = [...arr, 6];
console.log(arr); // [1, 2, 3, 4, 5, 6];
//es6的解构可以更简单的用于两个、多个数组的合并,添加插入

2. 数组删除、返回

1. length

 var arr = ["x", "y", "z"];
 arr.length = 2;
 console.log(arr[2]);  //undefined

2. delete

 var arr = [1, 2, 3, 4];
 delete arr[0]; 
 console.log(arr);   //[undefined, 2, 3, 4]
//  注意,此时虽然元素被删除,但是数组长度不变

3. pop()

var arr= ["x", "y", "z"];
var item = arr.pop();
console.log(item);      //"z"
console.log(arr.length);    //2

//  pop()直接将数组最后元素推出栈,此时数组长度有变化

4. shift()

 var arr= ["x", "y", "z"];
 var item = arr.shift();
 console.log(item);      //"red"
 console.log(colors.length);    //2

5. splice()

 var arr= ["x", "y", "z"];
 var item = arr.splice(0, 1);
 console.log(item);      //"x"
 console.log(arr);    //["y", "z"]

6. 迭代和过滤

//  两者本质一样,都是对数组进行条件操作,迭代可以对数组遍历从而对元素进行操作,过滤则也是如此
var arr= ["x", "y", "z"];
arr.forEach(function(item, index, arr) {
    if(item == "x") {
        arr.splice(index, 1);
    }
});
//["y", "z"]

arr2 = arr.filter(function(item) {
    return item != "z"
});
console.log(arr2);    //["x", "y"]

3. 其他数组操作

1. join()

var arr = [1,2,3];
console.log(arr.join());  //1,2,3
console.log(arr);  //[1, 2, 3]

2. slice 和 splice

slice

slice(start,end):方法可从已有数组中返回选定的元素,返回一个新数组,包含从start到end(不包含该元素)的数组元素。

start参数:必须,规定从何处开始选取,如果为负数,规定从数组尾部算起的位置,-1是指最后一个元素。
end参数:可选(如果该参数没有指定,那么切分的数组包含从start倒数组结束的所有元素,如果这个参数为负数,那么规定是从数组尾部开始算起的元素)。

var arr = [1,2,3,4,5];
console.log(arr.slice(1));//[2,3,4,5]  选择序列号从1到最后的所有元素组成的新数组。
console.log(arr.slice(1,3))//[2,3]  不包含end,序列号为3的元素

slice(start,end)可以作用于字符串的切割

splice

splice():该方法向或者从数组中添加或者删除项目,返回被删除的项目。(该方法会改变原数组)

index参数:必须,整数,规定添加或者删除的位置,使用负数,从数组尾部规定位置。
howmany参数:必须,要删除的数量,如果为0,则不删除项目。
tem1,...itemX参数:可选,向数组添加的新项目。

var arr = [1,2,3,4,5];
console.log(arr.splice(2,1,"hello"));//[3]  返回的新数组
console.log(arr);//[1, 2, "hello", 4, 5]  改变了原数组

slice 和splice区别在于一个不改变原数组(slice)一个改变了原数组(splice)
3. sort 排序

srot()如果不带参数,是将按字母顺序对数组中的元素进行排序,也就是是按照字符编码的顺序进行排序。

var arr1 = ['a', 'd', 'c', 'b'];
arr.sort();  //['a', 'b', 'c', 'd']
 
var arr2 = [10, 5, 40, 25, 100, 1];
arr2.sort(); //[1, 10 ,100, 25, 40, 5]

实现升序

arr.sort(function(a,b){
	return a - b;
})

实现降序

arr.sort(function(a,b){
	return b - a;
})

按照数组中对象的某一属性进行排序


var arr = [
    {name:'张三',age:18},
    {name:'李四',age:28},
    {name:'王五',age:38}
];
function compare(property){
    return function(a,b){
        var value1 = a[property];
        var value2 = b[property];
        return value1 - value2;
    }
}
console.log(arr.sort(compare('age'))) 
//  对象年龄升序排序

还有比较不常用的乱序

arr.sort(function(a,b){
	return Math.random() - 0.5;
})

4. reverse()

reverse() 方法用于颠倒数组中元素的顺序。返回的是颠倒后的数组,会改变原数组。

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

5. indexOf 和 lastIndexOf

都接受两个参数:查找的值、查找起始位置
不存在,返回 -1 ;存在,返回位置。
indexOf 返回第一个匹配的index,lastIndexOf 返回最后一个

var arr = [1, 2, 3];
arr.indexOf(2); // 1
arr.indexOf(4); // -1

var arr2= [1, 2, 3, 4, 2];
arr2.lastIndexOf(2);     // 4
arr2.lastIndexOf(5);     // -1
arr2.lastIndexOf(2, 4);  // 3
arr2.lastIndexOf(2, 3);  // 0

6. every

对数组的每一项都运行给定的函数,每一项都返回 ture,则返回 true,与filter不一样的是every返回的是布尔值的结果,而filter返回的是满足给定函数条件的数组

function bigThanTen(element, index, array) {
  return element > 10;
}    
[12, 15, 18, 13, 14].every(bigThanTen);   // true

7. some

与every一样返回布尔值,两者为与或逻辑

function compare(element, index, array) {
  return element > 10;
}    
[2, 5, 8, 3, 4].some(compare);  // false
[12, 5, 8, 3, 4].some(compare); // true

8. map

map()会返回新数组
对数组的每一项都运行给定的函数

var arr = [1, 5, 10, 15];
var doubles = numbers.map(function(x) {
   return x * 2;
});
// doubles [2, 10, 20, 30]
// arr [1, 5, 10, 15]

9. forEach 数组遍历

遍历数组,对数组元素做处理

const arr = ['x', 'y', 'z'];
const copy = [];    
arr.forEach(function(item){
  copy.push(item)
});

10. find()

返回符合条件的元素
传入一个回调函数,找到数组中符合当前搜索规则的第一个元素,返回它,并且终止搜索。

const arr = [1, "2", 3, "2"]
console.log(arr.find(n => typeof n === "number")) // 1

11. findIndex()

返回符合条件下标
传入一个回调函数,找到数组中符合当前搜索规则的第一个元素,返回它的下标,终止搜索。

const arr = [1, "2", 3, "2"]
console.log(arr.findIndex(n => typeof n === "number")) // 0

12. fill()

用新元素替换掉数组内的元素,可以指定替换下标范围。
arr.fill(value, start, end)

var arr = [0, 1, 2, 3, 4, 5]
console.log(arr.fill(1, 3, 5)); //[0,1,2,1,1,5]

13. copyWithin()

选择数组的某个下标,从该位置开始复制数组元素,默认从0开始复制。也可以指定要复制的元素范围。该方法改变数组

arr.copyWithin(target, start, end)
const arr = [1, 2, 3, 4, 5]
console.log(arr.copyWithin(3))
// [1,2,3,1,2] 从下标为3的元素开始,复制数组,所以4, 5被替换成1, 2

const arr2 = [1, 2, 3, 4, 5]
console.log(arr2.copyWithin(3, 0, 2)) 
//  [1,2,3,1,2]从下标3开始,替换0到2的元素,4、5被替换成1、2

注意,即使设置的元素范围大于起始位置到结束位置,依旧只会替换起始位置到最后一个元素那么多

14. from

将类似数组的对象(array-like object)和可遍历(iterable)的对象转为真正的数组

const a = ["a", "b", "c"];
Array.from(a);
// ["a", "b", "c"]

Array.from('like');
// ["l", "i", "k", "e"]

15. of

用于将一组值,转换为数组。这个方法的主要目的,是弥补数组构造函数 Array() 的不足。因为参数个数的不同,会导致 Array() 的行为有差异。

Array() // []
Array(3) // [, , ,]
Array.of(3) // [3]
Array(1, 11, 111) // [1, 11, 111]

16. entries() 返回迭代器:返回键值对

//数组
const arr = ['a', 'b', 'c'];
for(let v of arr.entries()) {
  console.log(v)
}
// [0, 'a'] [1, 'b'] [2, 'c']

//Set
const arr = new Set(['a', 'b', 'c']);
for(let v of arr.entries()) {
  console.log(v)
}
// ['a', 'a'] ['b', 'b'] ['c', 'c']
// new Set(['a', 'b', 'c']);为简写,key名与赋值同时可缩写为这个形式
//Map
const arr = new Map();
arr.set('a', 'a');
arr.set('b', 'b');
for(let v of arr.entries()) {
  console.log(v)
}
// ['a', 'a'] ['b', 'b']


17. values() 返回迭代器:返回键值对的value

//数组
const arr = ['a', 'b', 'c'];
for(let v of arr.values()) {
  console.log(v)
}
//'a' 'b' 'c'

//Set
const arr = new Set(['a', 'b', 'c']);
for(let v of arr.values()) {
  console.log(v)
}
// 'a' 'b' 'c'

//Map
const arr = new Map();
arr.set('a', 'A');
arr.set('b', 'B');
for(let v of arr.values()) {
  console.log(v)
}
// 'A' 'B'

18. keys() 返回迭代器:返回键值对的key

//数组
const arr = ['a', 'b', 'c'];
for(let v of arr.keys()) {
  console.log(v)
}
// 0 1 2

//Set
const arr = new Set(['a', 'b', 'c']);
for(let v of arr.keys()) {
  console.log(v)
}
// 'a' 'b' 'c'

//Map
const arr = new Map();
arr.set('A', 'a');
arr.set('B', 'b');
for(let v of arr.keys()) {
  console.log(v)
}
// 'A' 'B'

19. includes

判断数组中是否存在该元素,参数:查找的值、起始位置,可以替换 ES5 时代的 indexOf 判断方式。indexOf 判断元素是否为 NaN,会判断错误。

var a = [1, 2, 3, NaN];
a.includes(2); // true
a.includes(4); // false
console.log(a.indexOf(NaN))  // -1
console.log(a.includes(NaN))  // true

20. reduce

arr.reduce(callback,[initialValue])
/*
callback返回四个参数 :
	1、previousValue (上一次调用回调返回的值,或者是提供的初始值(initialValue))
    2、currentValue (数组中当前被处理的元素)
    3、index (当前元素在数组中的索引)
    4、array (调用 reduce 的数组)
initialValue :为初始调用callback的值
*/

//如果没有提供initialValue,reduce 会从索引1的地方开始执行 callback 方法,跳过第一个索引。如果提供initialValue,从索引0开始。

//数组求和
let  arr = [1, 2, 3, 4];
let sum = arr.reduce((x,y)=>x+y)
console.log( sum ); //求和,10

//计算乘积
let  arr = [1, 2, 3, 4];
let  mul = arr.reduce((x,y)=>x*y) 
console.log( mul ); //求乘积,24

//统计数组中出现相同元素次数
let arr= ['aa', 'bb', 'cc', 'dd', 'aa'];
 
let newArr= arr.reduce((pre,cur)=>{
  if(cur in pre){
    pre[cur]++
  }else{
    pre[cur] = 1 
  }
  return pre
},{})
console.log(arr); //{aa: 2, bb: 1, cc: 1, dd: 1}

//数组去重
let arr = [1,2,3,4,4,1]
let newArr = arr.reduce((pre,cur)=>{
    if(!pre.includes(cur)){
      return pre.concat(cur)
    }else{
      return pre
    }
},[])
console.log(newArr);// [1, 2, 3, 4]

//二维数组转化为一维数组
let arr = [[0, 1], [2, 3], [4, 5]]
let newArr = arr.reduce((pre,cur)=>{
    return pre.concat(cur)
},[])
console.log(newArr); // [0, 1, 2, 3, 4, 5]

//多维数组转为一维数组
let arr = [[0, 1], [2, 3], [4,[5,6,7]]]
const newArr = function(arr){
   return arr.reduce((pre,cur)=>pre.concat(Array.isArray(cur)?newArr(cur):cur),[])
}
console.log(newArr(arr)); //[0, 1, 2, 3, 4, 5, 6, 7]

//对象里对象属性值操作求和
var person= [
    {
        name: '张三',
        age: 10
    },
    {
        name: '李四',
        age: 20
    },
    {
        name: '王五',
        age: 30
    }
];
 
var ageSum = person.reduce(function(prev, cur) {
    return cur.score + prev;
}, 0);
console.log(ageSum ) //60
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值