数组交集

普通数组

  • filter()

    创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。
    filter() 不会对空数组进行检测。
    filter() 不会改变原始数组。
  • indexOf()

    采用方法可返回某个指定的字符串值在字符串中首次出现的位置。
    如果没有找到匹配的字符串则返回 -1。
const arr1 = [1, 2, 3, 4, 5, 8];
const arr2 = [5, 6, 7, 8, 9];
const data = arr1.filter( (val =>{
    return arr2.indexOf(val) >= 0
}))
// arr2数组中依次循环arr1数组中相匹配的值,
// arr1数组中的5在arr2数组中首次出现的下标为第0个,
// 8为第三个,所以判断 >= 0 返回在data中 打印 [5, 8]
console.log(data) [5, 8]

数组对象

  • some()

    用于检测数组中的元素是否满足指定条件(函数提供)
    方法会依次执行数组的每个元素:
    如果有一个元素满足条件,则返回ture,剩余的不会在执行检测。
    如果没有满足条件的元素,则返回false。
    不会对空数组进行检测。
    不会改变原始数组。
循环列出数组 arr1 与 arr2 的所有键值对,使用some方法依次进行匹对,数组 arr2 中 id 为 4 的对象与 arr1 中的数组没有相对应的匹配值,最终使用比较运算符得出除过id为 4 的所有值。
数组对象目前仅针对value值为简单的NumberStringBoolan数据类型。
下例中JSON.stringif()比较对象是简写方法,完整的对象比较。
const arr1 = [
    {name: 'name1', id: 1}, {name: 'name2', id: 2},
    {name: 'name3', id: 3}, {name: 'name5', id: 5}
];
const arr2 = [
    {name: 'name1', id: 1}, {name: 'name2', id: 2},
    {name: 'name3', id: 3}, {name: 'name4', id: 4},
    {name: 'name5', id: 5}
];
const result = arr2.filter(function (v) {
    // 简写 return arr1.some(n => JSON.stringify(n) === JSON.stringify(v))
    return arr1.some(n => {
        return JSON.stringify(n) === JSON.stringify(v)
    })
})
console.log(result); 
// [
//     {name: 'name1', id: 1},
//     {name: 'name2', id: 2},
//     {name: 'name3', id: 3},
//     {name: 'name5', id: 5}
// ]

数组并集

普通数组

  • concat()

    concat() 方法用于连接两个或多个数组。
    该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。
  • includes()

    方法用来判断一个数组是否包含一个指定的值,如果是返回 true,否则false。
    次方法也可以给检测字符串如下例:
let  str = "巴卡拉卡!乌龟变"
str.includes('乌龟变') true 
str.includes('大乌龟') false
对数组 arr2 进行过滤获取 arr2 中的所有数组然后使用 includes 方法依次对 arr2 数组进行比对,抛出为 ture的数据,使用 concat 方法将抛出的数据与 arr1 进行合并。
const arr1 = [1, 2, 3, 4, 5, 8, 9]
const arr2 = [5, 6, 7, 8, 9, 9, 8];
// 简写 const result = arr1.concat(arr2.filter(v => !arr1.includes(v)))
const result = arr1.concat(
    arr2.filter((v=>{ return !arr1.includes(v) }))
)
console.log(result) //[1, 2, 3, 4, 5, 8, 9, 6, 7]

数组对象

  • reduce()

    接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。
    可以作为高阶函数,用于函数的compose
    reduce对空数组是不会做执行的。
  • 语法:array.reduce(function(total, currentValue, currentIndex, arr), initialValue)

    total:初始值,或者计算结束之后的返回值。
    currentValue:当前的元素。
    ccurrentIndex:当前的索引。
    arr:当前元素的所有数组对象。
    initialValue:可选,传递函数的初始值。
// 将numbers的数组进行相加
let numbers = [15, 2, 1, 4];
const num = numbers.reduce(function (total, currentValue, currentIndex, arr){
    return total + currentValue
});
console.log(num) // 22

使用三元运算对数组对象进行去重。

const arr1 = [
    {name: 'name1', id: 1},
    {name: 'name2', id: 2},
  {name: 'name3', id: 3}
];
const arr2 = [
  {name: 'name1', id: 1},
    {name: 'name4', id: 4},
  {name: 'name5', id: 5}
];
let arr3 = arr1.concat(arr2);
let result = [];
let obj = [];
result = arr3.reduce(function (prev, data, index, arr) {
    obj[data.id] ? '' : obj[data.id] = prev.push(data)
    return prev;
}, []);
console.log(result);
// [
//     { name: 'name1', id: 1 },
//     { name: 'name2', id: 2 },
//     { name: 'name3', id: 3 },
//     { name: 'name4', id: 4 },
//     { name: 'name5', id: 5 }
// ]