20

Javascript数组的一些骚操作

 4 years ago
source link: https://www.helloweba.net/javascript/620.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

如何操作数组在编程语言和脚本语言中是最基础的技能,Javascript也提供了内置的的数组操作函数和方法,今天我们主要介绍前端开发中经常遇到的操作数组的常规方法以及ES6操作数组的神奇方法。

1.数组去重

1)常规方法去重

数组去重就是去掉数组中重复的项,我们使用常规的方法是定义一个新数组,遍历要去重的数组,然后一个个比对,如果数组中的值没有在新数组中出现,就将该值追加到新数组中,反之就不操作,最终得到一个去重后的新数组。

var a = [1,1,2,3,'abc',2,'ab','abc'];
function unique(x) {//去重
    let res = [];
    for (let i = 0; i < x.length; i++) {
        if (res.indexOf(x[i]) == -1) {
            res.push(x[i]);
        }
    }
    return res;
}
console.log(unique(a)); // [1, 2, 3, "abc", "ab"]

常规数组去重方法还有很多,可以用到 indexOfsort()includes ,还有递归等等方法去重。

2)ES6去重

利用es6特性去重方法:

let a = [1,1,2,3,'abc',2,'ab','abc'];
let arr = Array.from(new Set(a)); // 利用es6特性去重方法
console.log(arr); // [1, 2, 3, "abc", "ab"]

当然,我们还可以利用js扩展运算符的骚操作,代码就是这么少:

let a = [1,1,2,3,'abc',2,'ab','abc'];
let arr = [...new Set(a)];
console.log(arr); // [1, 2, 3, "abc", "ab"]

2.数组合并

我们要将两个数组合并成一个数组,也可以看作是拼接成一个数组,有很多种方法可以实现。

1)concat

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

concat方法连接arr1、arr2两个数组后,arr1、arr2两个数组的数据不变,同时会返回一个新的数组。这样当我们需要进行多次的数组合并时,会造成很大的内存浪费,所以这个方法肯定不是最好的。

2)for循环

for (var i in arr2) {
    arr1.push(arr2[i]);
}
console.log(arr1);//[1,2,3,4,5,6]

很好理解,for循环遍历数组arr2,然后把arr2的值一个个追加到arr1中,最终完成数组合并。

3)apply

apply方法有一个特性,那就是 func.apply(obj,argv) ,argv是一个数组。所以我们可以利用这一特性。

arr1.push.apply(arr1, arr2);
console.log(arr1);//[1,2,3,4,5,6]

4)ES6扩展运算符

ES6神奇的3个点点,完美替代 concat

let arr = [...arr1, ...arr2];
console.log(arr); //[1,2,3,4,5,6]

3.数组与字符串互转

1)常规方法

使用 split() 将字符串转换为数组。

var str = 'helloweba';
var res = str.split(''); //split()中的参数是分隔符,如,|,也可以是为空
console.log(res); //["h", "e", "l", "l", "o", "w", "e", "b", "a"]

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

var arr = ['hello', 'web', 'a'];
var res = arr.join('');
console.log(res); //helloweba

2)ES6写法

ES6将字符串转换为数组:

let str = 'helloweba';
let arr = [...str]; //等同于Array.from(str)
console.log(arr); //["h", "e", "l", "l", "o", "w", "e", "b", "a"]

ES6将数组转换为字符串:

我们先定义一个字符串a,然后把它转化成数组b,这个时候得到的数组并不是我们想要的。

let a = "[1,3,2]"; //字符串
let b = [...a];
console.log(b); //["[", "1", ",", "3", ",", "2", "]"]

我们再对数组b进行过滤,最终得到数组c。

let c = b.reduce((arr, v)=>{
          (typeof Number(v)) === 'number' && !isNaN(Number(v)) && arr.push(Number(v))
          return arr
        },[]);
console.log(c) // [1, 3, 2]

4.求数组中的最大值和最小值

1)排序法

我们将数组排序,从小到大排序,排序后的数组中第一个和最后一个值就是我们要的最小值和最大值。

var arr = [1,2,36,42,15];
arr.sort(function (a, b) {
    return a-b;
}); //[1, 2, 15, 36, 42]
var min = arr[0];  //1
var max = arr[arr.length - 1];  //42

2)ES6写法

使用 Math 对象方法。

let arr = [1,2,36,42,15];
let max = Math.max(...arr);
let min = Math.min(...arr);
console.log(max); //42
console.log(min); //1

5.数组降维

有时我们需要将多维数组转换成一维数组,可以使用以下代码:

var b = [1, [2, 3], [4, 5, 6, [7, 8, 9]]];
function jiangwei(x) {//数组降维
let res = [];
for (let i = 0; i < x.length; i++) {
  if (Array.isArray(x[i])) {
    let _r = jiangwei(x[i]);
    for (let j = 0; j < _r.length; j++) {
      res.push(_r[j]);
    }
  } else {
    res.push(x[i]);
  }
}
return res;
}
console.log(jiangwei(b)); //[1, 2, 3, 4, 5, 6, 7, 8, 9]

使用ES6的 reduce() 高级技巧将数组降维。

let arr = [1, [2, 3], [4, 5, 6, [7, 8, 9]]];
const newArr = function(arr){
   return arr.reduce((pre, cur)=>pre.concat(Array.isArray(cur) ? newArr(cur) : cur), []);
}
console.log(newArr(arr)); //[1, 2, 3, 4, 5, 6, 7, 8, 9]

6.其他

其他常用的数组操作方法:

sort() //升序
reverse() //倒序,反转
join() //将数组转为字符串
push() //添加到数组末尾
pop() //末尾移除最后一项
unshift() //添加到原数组开头
shift() //删除数组第一项
slice() //返回起始位置到结束位置之间的项[m,n) 不改变原数组
splice() //传两个参(m,n) 删除从m到n个之间的项 改变原数组; 传三个参(m,n,k)从当前m到n个前插入k
concat() //将参数添加到原数组中,不改变原数组
of() //将不是数组的转化为数组
fill() //用一个固定值填充一个数组中从起始索引到终止索引内的全部元素

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK