编辑代码

//  简单迭代器
//  var arr = [1,2,3]
//  var each = function( ary, callback ){
//  for ( var i = 0, l = ary.length; i < l; i++ ){
//      callback(i, ary[i] ); // 把下标和元素当作参数传给callback 函数
//  }
//  };
//  each( arr, function( i, n ){
//      console.log( [ i, n ] );
//  });

// ---------------------------------------------------------

// 原生迭代器
// class Iterator {
//     constructor(conatiner) {
//         this.list = conatiner.list
//         this.index = 0
//     }
//     next() {
//         if (this.hasNext()) {
//             return this.list[this.index++]
//         }
//         return null
//     }
//     hasNext() {
//         if (this.index >= this.list.length) {
//             return false
//         }
//         return true
//     }
// }
// class Aggregate {
//     constructor(list) {
//         this.list = list
//     }
//     getIterator() {
//         return new Iterator(this)
//     }
// }

// const ConcreteAggregate = new Aggregate([1, 2, 3, 4, 5])
// const ConcreteIterator = ConcreteAggregate.getIterator()
// while(ConcreteIterator.hasNext()) {
//     console.log(ConcreteIterator.next())
// }

// ---------------------------------------------------------

//  简单迭代器
// let arr = [1, 2, 3, 4]
// let m = new Map()
// m.set('a', 100)
// m.set('b', 200)
// function each(data) {
//     // 生成遍历器
//     let iterator = data[Symbol.iterator]()
//     let item = {done: false}
//     while (!item.done) {
//         item = iterator.next()
//         if (!item.done) {
//             console.log(item.value)
//         }
//     }
//     for (let item of data) {    
//         console.log(item)
//     }
// }

// each(arr)
// each(m)

// ---------------------------------------------------------

// 判断两个数组是否完全相等
// 内部迭代器
// const each = (arr, callback) => {
//     for (let i in arr) {
//         callback(i, arr[i]);
//     }
// }

// const compare = (arr1, arr2) => {
//     const flags = [];
//     if (arr1.length !== arr2.length) {
//         flags.length = 1
//         return '不相等(长度)';
//     }
//     each(arr1, function (i, n) {
//         if (n !== arr2[i]) {
//             flags.push(i)
//         }
//     })
//     return flags.length > 0 ? '不相等' : '相等'
// }

// const aa = compare([1, 2, 3], [1, 3, 3])
// console.log(aa)
// console.log('----------------');

// ---------------------------------------------------------

//  外部迭代器
// const Iterator = (obj) => {
//     let current = 0;
//     const next = () => {
//         current += 1;
//     }
//     const isDone = () => {
//         return current >= obj.length;
//     }
//     const getCurrentItem = () => {
//         return obj[current];
//     }
//     return {
//         next,
//         isDone,
//         getCurrentItem
//     }
// }

// const compare1 = function (iterator1, iterator2) {
//     while (!iterator1.isDone() && !iterator2.isDone()) {
//         if (iterator1.getCurrentItem() !== iterator2.getCurrentItem()) {
//             console.log('不相等');
//             return;
//         }
//         iterator1.next();
//         iterator2.next();
//     }
//     console.log('相等');
//     return;
// }

// const iterator1 = Iterator([1, 2, 3]);
// const iterator2 = Iterator([1, 2, 4]);

// compare1(iterator1, iterator2)