javascript的filter、map数组深浅拷贝之展开语法的奇技淫巧
  6DMaaPzJglxt 2023年12月05日 31 0



javascript的小技巧笔记

  • filter和map
  • filter筛选数据(数据一样)
  • map返回数组对象(长度一样)
  • 深浅拷贝
  • 浅拷贝
  • 数组的深拷贝
  • 奇淫巧计
  • 数组去重
  • 数组最大、最小
  • 数组某个值的出现次数
  • 返回两个数组的不同元素
  • 返回两个数组的相同元素



javascript的filter、map数组深浅拷贝之展开语法的奇技淫巧_javascript

filter和map

filter筛选数据(数据一样)

filter不会改变原数组,返回一个新的数组
return 对true和false判断
返回return true的子项
不会修改原数组的子项

  • 长度:小于等于
  • 数据:子集

例1:

let array1=['yma16','china']
let array2=array1
// 对原数组筛选
let array3=array2.filter((item,index)=>{
  if(item=='china'){
     item='changed'
     console.log('原来子项',array2[index])
     return true
  }
})
console.log('array1',array1)
console.log('array2',array2)
console.log('array3',array3)

javascript的filter、map数组深浅拷贝之展开语法的奇技淫巧_数组_02


不对原来数组进行修改,产生原数组的子项

返回的数组是原数组的子集

例2:

即使数据被修改,返回的也是数据修改后子集

let array1=['yma16','china']
let array2=array1
// 对原数组筛选 修改子项
let array3=array2.filter((item,index)=>{
  if(item=='china'){
     console.log('原来子项',array2[index])
     array2[index]='changed'
     return true
  }
})
console.log('array1',array1)
console.log('array2',array2)
console.log('array3',array3)

javascript的filter、map数组深浅拷贝之展开语法的奇技淫巧_深拷贝_03


由于赋值为浅拷贝,array2传递为引用,当array2修改时array1也被修改

例3:

如果子项为字典,修改字典数据,

let array1=[{name:'yma16',country:'china'}]
let array2=array1
// 对原数组筛选 新增age
let array3=array2.filter((item,index)=>{
  item.age=18
  return true
})
console.log('array1',array1)
console.log('array2',array2)
console.log('array3',array3)

javascript的filter、map数组深浅拷贝之展开语法的奇技淫巧_javascript_04

map返回数组对象(长度一样)

数组map返回的不一定是他的子项

  • 数据:可以自定义
  • 长度:与原数组保持一致

例1:
map不会对数组进行筛选,如果不返回数据,则默认返回undefined作为子项

let array1=['yma16','china']
let array2=array1
// 返回新数组
let array3=array2.map((item,index)=>{
  if(item=='china'){
     item='changed'
     console.log('原来子项',array2[index])
     return item
  }
})
console.log('array1',array1)
console.log('array2',array2)
console.log('array3',array3)

javascript的filter、map数组深浅拷贝之展开语法的奇技淫巧_数组_05

深浅拷贝

浅拷贝

普通的赋值为浅拷贝,传递的是引用
例1:

let array1=['yma16','china']
let array2=array1
// 浅拷贝
array2.map((o,index)=>{
  array2[index]='我是array2'
})
console.log('array1',array1)
console.log('array2',array2)

javascript的filter、map数组深浅拷贝之展开语法的奇技淫巧_数据_06

数组的深拷贝

数组的深拷贝
JSON.stringify将对象解析为字符串
JSON.parse将字符串解析为键值对
相辅相成
例1:
深拷贝数组,其地址指向不同

let array1=['yma16','china']
let array2=JSON.parse(JSON.stringify(array1))
// 深拷贝
array2.map((o,index)=>{
  array2[index]='我是array2'
})
console.log('array1',array1)
console.log('array2',array2)

javascript的filter、map数组深浅拷贝之展开语法的奇技淫巧_数据_07

奇淫巧计

展开语法…
展开语法和 Object.assign() 行为一致, 执行的都是浅拷贝(只遍历一层),可以在函数调用/数组构造时, 将数组表达式或者string在语法层面展开;还可以在构造字面量对象时, 将对象表达式按key-value的方式展开
例:展开语法深拷贝数组

let array1=['yma16','china']
let array2=[...array1]
// 深拷贝
array2.map((o,index)=>{
  array2[index]='我是array2'
})
console.log('array1',array1)
console.log('array2',array2)
VM1696:7 array1 (2) ["yma16", "china"]
VM1696:8 array2 (2) ["我是array2", "我是array2"]

javascript的filter、map数组深浅拷贝之展开语法的奇技淫巧_数组_08

数组去重

function noRepeat(arr) {
  return [...new Set(arr)]
}
function noRepeat(arr) {
  return Array.from(new Set(arr))
}

javascript的filter、map数组深浅拷贝之展开语法的奇技淫巧_数据_09

数组最大、最小

最大

function arrayMax(arr) {
  return Math.max(...arr);
}

最小

function arrayMin(arr) {
  return Math.min(...arr);
}

javascript的filter、map数组深浅拷贝之展开语法的奇技淫巧_javascript_10

数组某个值的出现次数

function countOccurrences(arr, value) {
  return arr.reduce((a, v) => v === value ? a + 1 : a + 0, 0);
}

返回两个数组的不同元素

function diffrence(arrA, arrB) {
  return arrA.filter(v => !arrB.includes(v))
}

返回两个数组的相同元素

function intersection(arr1, arr2) {
  return arr2.filter(v => arr1.includes(v))
}

javascript的filter、map数组深浅拷贝之展开语法的奇技淫巧_深拷贝_11


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月05日 0

暂无评论

推荐阅读
  f18CFixvrKz8   2024年05月20日   90   0   0 JavaScript
  fxrR9b8fJ5Wh   2024年05月17日   52   0   0 JavaScript
6DMaaPzJglxt