js处理数据的常用方法

一,遍历数据array

1,for循环遍历

JavaScript中的for循环是一种控制流语句,用于重复执行某个操作,直到满足指定的条件


for (初始化表达式; 条件表达式; 更新表达式) {
    // 循环体语句
}
const arr=[1,2,3]
for (let i=0; i<arr.length; i++){
  console.log(arr[i]);
  //1
  //2
  //3
}

2,for of

for...of循环JavaScript中的一种循环结构,它允许开发者遍历各种数据结构,如数组、字符串、MapSet等,从而更加高效地编写代码。for...of循环的语法如下:

for(variable of iterable) {
  // code block to be executed
}

keys,values,entries
它们都返回一个遍历器对象,可以用 for…of 循环进行遍历
keys – 返回元素索引
values – 返回元素本身
entries – 返回元素和下标

const arr = ['a', 'b', 'c'];
// keys
for (let index of arr.keys()) {
    console.log(index);
    // 0
    // 1
    // 2
}

// values
for (let ele of arr.values()) {
    console.log(ele);
    // a
    // b
    // c
}

//entries
for (let [index, ele] of arr.entries()) {
    console.log(idnex, ele);
    // 0 "a"
    // 1 "b"
    // 2 "c"
}

3,forEach遍历

遍历数组,和for循环功能一致

arr.forEach((item,index,self)=>{
    item:数组的每一个元素
    index:元素下标
    self:数组本身
    // 无返回值
})

4,map

映射数组的所有项

arr.map((item,index,self)=>{
    item:数组的每一个元素
    index:元素的下标
    self:数组本身
    // 有返回值
    // 返回满足某个条件的元素构成的数组
})
let arr = [1,2,3]
// 完整写法
let res = arr.map((item,index)=>{
    return item* 2
})
// 简写
let res = arr.map(item=>item*2) // 返回数组[2,4,6]
let res = arr.map(item=>item*2).join(',')  // 返回拼接后的字符串'2,4,6'

5,filter

筛选数组;将符合条件的元素放入新数组

let arr = [1,2,3,4,5]
// 完整写法
let res = arr.filter((item,index)=>{
    if(item % 2 == 0){
        return true
    }
})
// 简写  筛选偶数
let res = arr.filter(item=>item % 2 == 0) // [2,4]

6,every

判断数组中是否所有元素都符合条件

arr.every((item,inedx, self)=>{
    item:数组的每一个元素
    index:元素的下标
    self:数组本身
    // 有返回值
    // 检测数组里的每一个值是否满足条件,如果有一个值不满足,则返回false,剩余的值不在进行检测
    // 如果所有的值都满足,则返回true    
})
let arr = [1,2,-1]
// 完整写法
let res=arr.every((item,index)=>{
    if(item>0){
        return true
    }
})
// 简写
let res = arr.every(item=>item>0) // false

7,some

判断数组中是否有符合条件的元素;非空判断

arr.some((item,inedx, self)=>{
    item:数组的每一个元素
    index:元素的下标
    self:数组本身
    // 有返回值
    // 检测数组里的每一个值是否满足条件,如果有一个值满足,则返回true,剩余的值不在进行检测
    // 如果所有的值都不满足条件,则返回false
})
let arr = [1,2,3,4,5,-1]
// 完整写法
let res = arr.some((item,index)=>{
    if(item < 0) {
        return true
    }
})
let res = arr.some(item=>item < 0) // true
let res2 = arr.some(item=>item) // true

let arr2 = []
let res3 = arr.some(item=>item ) // false

8,find(返回符合条件的第一项)

没找到返回undefined,对于空数组,是不会执行的,并且不会改变原数组

const arr = [
    {name: 'tony', age: '20'},
    {name: 'jack', age: '18'}
]
const result1 = arr.find(item => {
    return item.name === 'jack';
})
console.log(result1); // {name: 'jack', age: 18}

const result2 = arr.find(item => {
    return item.namee === 'mary';
})
console.log(result2); // undefined

9、findIndex(返回符合条件的第一项的下标)

const arr = [
    {name:'tony1',age:'20'},
    {name:'tony2',age:'20'},
    {name:'tony3',age:'20'},
    {name:'jack',age:"30"}, // 只管返回第一个满足条件的
    {name:'jack',age:"100"}
];
const result = arr.findIndex(item => {
    return item.name === 'jack';
})
// 简写
const res = arr.findIndex(item=>item.name === 'jack')
console.log(result); // 3

10,reduce高阶函数(迭代(累加器))

reduce()函数是 ECMAScript 6 (ES6) 中数组的一个迭代方法,它接收一个回调函数作为累加器(accumulator),对该数组的所有元素(从左到右)执行操作,最后将计算结果累积为单一输出值。

reduce 函数是 JavaScript 中的一个功能强大的高阶函数,它算是 JS 数组方法里面较为复杂的一个函数了。reduce 的灵活性在于它能够遍历数组的所有元素,根据提供的函数累积一个最终的返回值。reduce()方法可以应用的场景特别多,循环遍历能做的,reduce都可以做,比如数组求和、数组求积、统计数组中元素出现的次数、数组去重等等。

function((total,currentValue, index,arr)=>{},initialValue):回调函数,必需。
total:上一次回调函数的返回值,第一次调用回调函数时,如果指定的初始值 initialValue,那么该参数值就是 initialValue,否则就是数组元素的第一个。
currentValue:数组中正在处理的元素。在第一次调用时,若指定了初始值 initialValue,那么当前处理的元素就是数组的第一个元素,否则的话就是第二个元素。
currentIndex:数组中正在处理的元素的索引。若指定了初始值 initialValue,则起始索引号为 0,否则从索引 1 起始。
array:用于遍历的数组。
initialValue:可选。传递给函数的初始值。也就是第一次调用回调函数时参数total,是否指定初始值将会影响其它几个参数的值。
reduce 方法的返回值就是遍历所有数组执行回调函数后的返回值。

arr.reduce((total,item,index,self)=>{
    total:初始值或计算结束后的返回值
    item:数组的每一个元素
    index:元素的下标
    self:数组本身
    // 有返回值
    // 返回计算结束后的total
},0) // 初始值,不写0 遇到空数组会报错
let arr = [1,2,3,4,5]
// 累加
let res = arr.reduce((prev,cur)=>prev+cur,0) // 15
// 求最大值
let max = arr.reduce((prev,cur)=>prev>cur ? prev: cur,0)  // 5
//按指定属性求和:
const arr = [
    { name: '小明', score: 98 }, 
    { name: '小花', score: 96 }, 
    { name: '小强', score: 90 }, 
];
const result = arr.reduce((total, currentValue) => { 
    return total + currentValue.score
}, 0);
console.log(result); // 284
//数组去重
const arr = [1, 2, 2, 3, 3, 4, 4, 5, 6];
const result = arr.reduce((total, currentValue) => {
    if(!total.includes(currentValue)) {
        total.push(currentValue)
    }
    return total;
}, []);
console.log(result);
// [1, 2, 3, 4, 5, 6]

二,遍历对象object

1,for … in

用于迭代对象的可枚举字符串属性,包括自身属性和继承的属性,但不会遍历对象的原型链上的 非可枚举属性,以及对象的方法

for( let key in obj ) {
    key:属性名
    obj[key]:属性值
}

2,for of

用于迭代可迭代对象定义的要进行迭代的值。可迭代对象 包括 数组、字符串、Set、Map等,还包括 arguments 对象。它遍历的是可迭代对象的迭代器(Iterator)返回的值或键值对,而不能直接用于普通的对象。

keys,values,entries
它们都返回一个遍历器对象,可以用 for…of 循环进行遍历
keys – 返回元素索引
values – 返回元素本身
entries – 返回元素和下标

   //for..of  遍历对象
        for( const key of obj){
            console.log(key)  //报错 Uncaught TypeError: obj is not iterable
        }
        
        //Object.keys()方法
                for(const key of Object.keys(obj)){
            console.log(key)
       }

3,Object.keys

Object.keys:返回对象自身属性名组成的数组
Object.values:返回对象自身属性值组成的数组
Object.entries

Object.keys(obj).forEach((key)=>{
    key:属性名
    obj[key]:属性值
})

三,数组去重

1,利用Set()+Array.from()

将数组的每一个元素依次与其他元素做比较,发现重复元素,删除
Set对象:是值的集合,你可以按照插入的顺序迭代它的元素。 Set中的元素只会出现一次,即Set中的元素是唯一的。
Array.from() 方法:对一个类似数组或可迭代对象创建一个新的,浅拷贝的数组实例。

const arr = [1, 2, 2, 'abc', 'abc', true, true, false, false, undefined, undefined, NaN, NaN]
 
const result = Array.from(new Set(arr))
console.log(result) // [ 1, 2, 'abc', true, false, undefined, NaN ]

2,利用数组的includes+push方法

此方法逻辑与indexOf方法去重异曲同工,只是用includes方法来判断是否包含重复元素。
includes()方法:用来判断一个数组是否包含一个指定的值,根据情况,如果包含则返回 true,否则返回 false。

const arr = [1, 2, 2, 'abc', 'abc', true, true, false, false, undefined, undefined, NaN, NaN]
 function removeDuplicate(arr) {
    const newArr = []
    arr.forEach(item => {
 
       if (!newArr.includes(item)) {
       newArr.push(item)
      }
 
   })
  return newArr
 }
 
 const result = removeDuplicate(arr)
 console.log(result) // [ 1, 2, 'abc', true, false, undefined, NaN ]

3,利用forEach+indexOf方法

新建一个空数组,遍历需要去重的数组,将数组元素存入新数组中,存放前判断数组中是否已经含有当前元素,没有则存入。此方法也无法对NaN去重。
indexOf() 方法:返回调用它的String对象中第一次出现的指定值的索引,从 fromIndex 处进行搜索。如果未找到该值,则返回 -1。

const arr = [1, 2, 2, 'abc', 'abc', true, true, false, false, undefined, undefined, NaN, NaN]
function removeDuplicate(arr) {
 
   const newArr = []
 
   arr.forEach(item => {
 
     if (newArr.indexOf(item) === -1) {
     newArr.push(item)
    }
 })
 return newArr // 返回一个新数组
}
 
const result = removeDuplicate(arr)
console.log(result) // [ 1, 2, 'abc', true, false, undefined, NaN, NaN ]

4,对象数组去重利用filter 和Map

function uniqueObjectArray(arr: any) {
  const map = new Map()
  return arr.filter((item: any) => {
    const key = JSON.stringify(item)
    const isNew = !map.has(key)
    map.set(key, item)
    return isNew
  })
}

let arr1 = [{a:1,b:2},{a:1,b:2},{a:4,b:5}]
console.log(uniqueObjectArray(arr1));
///[{a:1,b:2}{a:4,b:5}]
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容