是否可迭代可以通过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())
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不会出现在遍历的结果中
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
}
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
}
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
})
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
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])
}
}
}()