js的六种迭代

是否可迭代可以通过Symbol.iterator()来确定某个变量是否可迭代:

let arr=[0,9,3]
const iteratorArr2=arr[Symbol.iterator]()
console.log(iteratorArr2,iteratorArr.next())//{value:0,done:false}

let obj={name:'xunpu',age:25}
const iteratorObj=obj[Symbol.iterator]()//报错,obj[Symbol.iterator] is not a function
console.log(iteratorObj.next())
  1. for...in遍历对象

以任意顺序迭代一个对象的除Symbol以外的可枚举属性,包括继承的可枚举属性。像Array和Object使用内置的构造函数创建的对象都会来自Object.prototype和String.prototype的不可枚举属性,这种是无法遍历的。常用于迭代对象!!

注意:for in循环会将对象中的key值按照升序排序,最后value的顺序就是按照key的升序顺序得到的。

for i in arr/obj时,如果遍历的是数组,那么i为index,arr[i]为元素;遍历的是对象,那么i为key,obj[key]为value值:

let arr=[1,2,3]
for(let i in arr){
    console.log(i)//0 1 2
}

let obj={1:'1',3:'2',5:'6',[Symbol(1)]:'我是Symbol'}
for(let i in obj){
    console.log(i,obj[i])//1 1;3 2;5 6
}
//Symbol不会出现在遍历的结果中
  1. for...of遍历数组

可以迭代数组、类数组以及任何可迭代的对象(maps、sets、DOM集合),不能遍历对象!!!

//遍历数组
let arr=[1,2,3]
for(let i of arr){
    console.log(i)
}
//遍历对象数组
let objArr=[{name:'John Smith'},{name:'Jane Doe'}]
for(let {name} of objArr){
    console.log(name)
}
//遍历类数组迭代
function sum(){
    let sum=0
    for(let i of arguments){
        sum+=i
    }
    return sum
}
sum(1,2,3)//6
//遍历字符串
let arr='hello world'
let res=''
for(let c of arr){
    res+=c+' '
}
console.log(res)//h e l l o   w o r l d 
//迭代map
const map2=new Map()
map2.set('name','xunpu')
map2.set('age',234)
for(let [key,value] of map2){
    console.log(key,value)//name xunpu; age 234
}
//迭代Set
const set=new Set(['Monday','Tuesday','Wednesday','Monday'])
for(let day of set){
    console.log(day)//Monday Tuesday Wednesday
}

//遍历对象会报错
let obj={1:'1',3:'2',5:'6',[Symbol(1)]:'我是Symbol'}
for(let i of obj){
    console.log(i,obj[i])//Error obj is not iterable
}
  1. for循环

基础循环语句,很自由&强大

//遍历数组
let arr=[9,8,4]
for(let i=0;i<arr.length;i++){
    console.log(arr[i])//9 8 4
}
//遍历对象
let obj={name:'xunpu',age:24}
let keyList=Object.keys(obj)
for(let i=0;i<keyList.length;i++){
    console.log(keyList[i],obj[keyList[i]])//name xunpu;age 24
}
  1. forEach遍历数组

来自Array.prototype.forEach,是数组的原型方法,可以同时获取下标和值

arr.forEach(callback(currentValue,currentIndex,arr)[,thisArg])
//第一个参数为当前值;第二个参数为当前索引,可选;第三个参数为当前数组,可选;thisArg为可选,callback中this的值,如果没有指定则为全局对象。

//遍历数组
let arr=[100,2,98]
arr.forEach((item,index)=>{
    console.log(item,index)//100 0;2 1;98 2
})
  1. some()用于检测数组中是否有元素满足某个条件

依次遍历数组的每个元素,如果有一个元素满足条件即返回true,剩余的元素将不会再进行检测。

注意:some不会对空数组检测,如果对空数组使用some()则返回false;some()不会改变原数组。

array.some(function(currentValue,currentIndex,arr),thisValue)
//遍历数组
let arr=[100,2,98]
console.log(arr.some(item=>item>18))//true

let arr2=[]
console.log(arr2.some(item=>item>1))//false
  1. every()用于检测数组的每个元素是否满足某个条件

依次遍历数组的每个元素,如果有一个不满足某个条件即返回false;全部满足则返回true。

注意:every()不会对空数组进行检测,如果对空数组使用every(),则返回true;every()不会改变原数组。

//遍历数组
let arr=[100,2,98]
console.log(arr.every(item=>item>18))//false

let arr2=[]
console.log(arr2.every(item=>item>1))//true

题目:合并表记录

描述:数据表记录包含表索引index和数值value(int范围的正整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照index值升序进行输出。

输入描述:先输入键值对的个数n(1<=n<=500),接下来n行每行输入成对的index和value值,以空格隔开。

输出描述:输出合并后的键值对(多行)

思路:1、首先接收输入行n;2、依次接收n行,每行解析出k,v;3、如果obj[k]存在,则obj=obj[k]+v;否则obj[k]=v;4、通过for...in...obj输出key以及value

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;


void async function () {
    // Write your code here
    while(line = await readline()){
        let n=parseInt(line)
        let obj={}
        while(n-->0){
            let kv=await readline()
            const [k,v]=kv.split(' ')
            if(obj[k]){
                obj[k]+=parseInt(v)
            }else{
                obj[k]=parseInt(v)
            }
        }
        for(let j in obj){
            console.log(j+' '+obj[j])
        }
    }
}()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值