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}]
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容