关于数组的合并、排序、乱序、累加、累积、去重、交集、并集、移除数组中的空项等操作,速来围观!

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);

 

posted @ 2019-02-21 16:54  三石小小  阅读(764)  评论(0编辑  收藏  举报