关于数组的合并、排序、乱序、累加、累积、去重、交集、并集、移除数组中的空项等操作,速来围观!
1、数组的合并(并集) concat()
方法用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组。
var array1 = ['a', 'b', 'c'];
var array2 = ['d', 'e', 'f'];
console.log(array1.concat(array2)); // expected output: Array ["a", "b", "c", "d", "e", "f"]
还可以利用es6中的set进行合并
let arr1 = [1,1,2,6,8,100,2,2,2,3,4,5,6];
let arr2 = [4,4,5,5,5,5,6,0,10,1000];
let arrnew1 = new Set([...arr1,...arr2]);
console.log('arrnew1:',arrnew1); // [1,2,6,8,100,3,4,5,0,10,1000] new Set([...arr1,...arr2])会自动去重并合并自己可以百度一下Set和...(三个小点点)的意思
2、对数组中的值进行筛选,看是否符合你自己规定的标准
every()
方法测试数组的所有元素是否都通过了指定函数的测试( )
function isBelowThreshold(currentValue) { return currentValue < 40; } var array1 = [1, 30, 39, 29, 10, 13]; console.log(array1.every(isBelowThreshold)); // expected output: true
也可以使用includes()的判断方法 ,它可以用于字符串的筛选
function test2(fruit){ //includes()的判断方法 ,也可以用于字符串的筛选, let fruits = ['苹果','香蕉','橘子','梨','菠萝']; if(fruits.includes(fruit)){ console.log("此种水果在名单中!"); }else{ console.log("此种水果不在名单中!"); } } test2('苹果'); // 返回值为true
filter()
筛选方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。
var words = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present']; const result = words.filter(word => word.length > 6); console.log(result); // expected output: Array ["exuberant", "destruction", "present"]
find()
方法返回数组中满足提供的测试函数的第一个元素的值。否则返回 undefined
。
var array1 = [5, 12, 8, 130, 44]; var found = array1.find(function(element) { return element > 10; }); console.log(found); // expected output: 12
findIndex()
方法返回数组中满足提供的测试函数的第一个元素的索引。否则返回-1。
var array1 = [5, 12, 8, 130, 44]; function isLargeNumber(element) { return element > 13; } console.log(array1.findIndex(isLargeNumber)); // expected output: 3
3、flat()
方法会递归到指定深度将所有子数组连接,并返回一个新数组,还会移除数组中的空项
直接上代码体会一下。
这是某一家公司的面试题
已知var arr = [ [1,2,2], [3, 4, 5, 5], [6, 7, 8, 9,[11,12,[12,13,[14]]]], 10 ]; 要达成的目标 var res= [1,2,3,4,5,6,7,8,9,10,11,12,13,14]
var arr1 = [1, 2, [3, 4]]; arr1.flat(); // [1, 2, 3, 4] var arr2 = [1, 2, [3, 4, [5, 6]]]; arr2.flat(); // [1, 2, 3, 4, [5, 6]]
arr2.flat().flat();
// [1, 2, 3, 4, 5, 6] 下面一段是简写形式,直接.flat(2)就OK了。
var arr3 = [1, 2, [3, 4, [5, 6]]];
arr3.flat(2); // [1, 2, 3, 4, 5, 6]
var arr4 = [1, 2, , 4, 5];
arr4.flat(); // [1, 2, 4, 5] flat()方法会移除数组中的空项:
拓展://reduceRight()
方法接受一个函数作为累加器(accumulator)和数组的每个值(从右到左)将其减少为单个值。
const array1 = [[0, 1], [2, 3], [4, 5]].reduceRight( (accumulator, currentValue) => accumulator.concat(currentValue) ); console.log(array1); // expected output: Array [4, 5, 2, 3, 0, 1]
4、数组的去重方法
(1)、ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。Set 本身是一个构造函数,用来生成 Set 数据结构。
let a = [1,1,2,2,3,3,5,6,89,]; let b = [...new Set(a)]; //此时声明的b是一个有set新声明的对象 console.log(b); //[1,2,3,5,6,89]
(2)、Array.from 方法可以将 Set 结构转为数组。我们可以专门编写使用一个去重的函数
let a = [1,1,2,2,3,3,5,6,89,];
function quchong(array){ return Array.from(new Set(array)); }
let c = quchong(a);
console.log(c) //[1,2,3,5,6,89]
(3)、利用新声明的空数组与之进行比较再重组 (遍历方法indexOf)
首先看一下indexOf(),该
方法返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1。
var beasts = ['ant', 'bison', 'camel', 'duck', 'bison']; console.log(beasts.indexOf('bison')); // expected output: 1 // start from index 2 console.log(beasts.indexOf('bison', 2)); // expected output: 4 console.log(beasts.indexOf('giraffe')); // expected output: -1
然后再看下面的这个去重的例子
var arr1 = [1,2,3,1];// 1.创建一个空数组保存去重后的新数组 var arr2 = []; // 2.循环遍历 for ( var i = 0; i < arr1.length; i++ ) { if ( arr2.indexOf(arr1[i]) === -1 ) { arr2.push(arr1[i]) } } console.log(arr2);
先看一个小例子
let list = {
"userName":"张三",
"password":"123456",
"data":[1,2,2,5],
"page":"3",
}
for(let i in list){ //这里的i就相当于对象的属相名
console.log(i,list[i])
}
// userName 张三
// password 123456
// data (4) [1, 2, 2, 5]
// page 3
// 第二种方法:通过对象的每一属性比较去重 var arr1 = [1,2,3,1]; // 1.创建一个空数组保存去重后的新数组,创建一个对象用来判断是否是重复项 var arr2 = []; var obj = {}; // 2.循环遍历 for ( var i = 0; i < arr1.length; i++ ) { if ( !obj[arr1[i]] ) { obj[arr1[i]] = 1; arr2.push(arr1[i]) } } console.log(arr2);
// 第三种方法:先排序,再去重 var arr1 = [1,2,3,1,2]; // 创建一个新的数组 var arr2 = []; // 先将原数组排序 arr1.sort(function(a,b){return a-b}); // 对arr1循环遍历 如果arr1的这一项 不等于 arr2 的最后一项,那么就把这一项追加到arr2中 for(var i = 0; i < arr1.length; i++){ if(arr1[i] !== arr2[arr2.length - 1]){ arr2.push(arr1[i]) } } console.log(arr2);
// 第四种方法 var arr = [1,2,3,4,5,4,2,3,4,8,6,7,5,9,7,5,3,6,7,8]; //创建一个新的数组用来存放数据 var arr2 = []; for (var i = 0; i < arr.length; i++) { // index可以找到每一项第一次出现的位置 如果索引i等于数值arr[i]第一次出现的说明此项第一次出现 if (arr.indexOf(arr[i]) == i) { arr2.push(arr[i]); } } console.log(arr2);
//第五种方法 let arr = [1,2,1,2,3,5,4,5,3,4,4,4,4]; let result = arr.sort().reduce((init, current)=>{ if(init.length===0 || init[init.length-1]!==current){ init.push(current); } return init; }, []); console.log(result); //[1,2,3,4,5]
五、数组中各项的累加、累积
//方法一:
let foo = [1,2,3,4,5]; function sun(arr){ //传统方式 let x = 0; for(let i = 0; i<arr.length; i++){ x += arr[i]; } return x; }
console.log(sun(foo));
方法二: reducer 函数的返回值分配给累计器,该返回值在数组的每个迭代中被记住,并最后成为最终的单个结果值。
let foo = [1,2,3,4,5]; let newfoo = foo.reduce((a,b) => a+b); //数组各项相加 15 let newfoo1 = foo.reduce((a,b) => a*b); //数组各项相乘 120
六、数组乱序
<script> /* 数组乱序 */ var arr = [1,2,3,4,5]; /* 每次循环时都要与第i项互换位置 */ for (var i = 0; i < arr.length; i++) { /* 获取一个0-5的随机数 */ var j = parseInt(Math.random() * arr.length); /* 将所获取的数和第i个数互换位置 */ var temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } console.log(arr); </script> var arr = [1,2,3,2,1]; var arr1 = arr.filter(function(v,i,s){ // 过滤出符合筛选条件的元素,返回一个新的数组 /* s == arr 数组的每一项的值v在数组s的索引 */ /* i = 0 时,v=1在当前数组的索引为0,每次都是从开始遍历 */ return s.indexOf(v) === i; }); console.log(arr1);