【问题标题】:Best way to code iterator in javascript在 javascript 中编写迭代器的最佳方法
【发布时间】:2023-03-25 15:52:01
【问题描述】:

我正在用 Javascript 构建一个复杂的对象,我想在对象的内部集合上公开一个迭代器。

我能想到的唯一方法是在prototype.js中公开迭代器的常用方法:

customObject.each(function (item) { ... })

迭代器each为集合中的每个项目一个接一个地调用提供的函数。

你知道其他可靠的方法吗?也许是一种让用户使用通常的 foreach 构造的方法?

【问题讨论】:

    标签: javascript iterator


    【解决方案1】:

    原型样式函数是一个不错的选择,但您也可以考虑类似:

    overlayRegistry = function() {
    var overlays = [];
    var index = 0;
    
    
    return {
        addOverlay : function(overlay) {
                overlays.push(overlay);
        count : function() {
            return overlays.length;
        },
        reset : function() {
            index = 0;
        },
        next : function() {
            if (index < overlays.length) {
                return overlays[index++];
            } else {
                return null;
                        }
        },
        each : function (callback) {
            for (var index = 0, length = overlays.length; index < length; ++index) {
                 callback(overlays[index]);
            }
        }
    
    }
    }();
    

    在这种情况下,您可以在等待其他事件的同时逐步迭代它(就像这个结构背后的情况一样)

    基本上,如果您只需要简单的迭代,提供像each 这样的方法可以很好地工作,但如果您需要更多控制,那么上面的方法可以工作(当然,你可以同时做)

    编辑
    添加了每个方法

    【讨论】:

      【解决方案2】:

      您应该改用for in

      >>> var customObject = {x: 1, y:2}
      >>> for (a in customObject) console.log(a, customObject[a])
      × 1
      是 2
      

      但请记住继承属性。

      >>>Object.prototype.yarrr = function yarrr(){ console.warn('YARRR!') }
      >>> for (a in customObject) console.log(a, customObject[a])
      × 1
      是 2
      亚尔()
      >>> for (a in customObject) if (customObject.hasOwnProperty(a)) console.log(customObject[a])
      × 1
      是 2

      【讨论】:

      • 是的,但您需要确保 customObject.hasOwnProperty(a) 为每个方法/属性返回 true。否则你可能会得到继承的东西。
      • 考虑到它是一个复杂的对象,我只能假设它有 for..in 也会迭代的方法。
      • 如果我正确理解了这个问题,他的自定义对象有一个内部集合,他想提供一种方法来迭代内部集合中的元素,而不是自定义对象的属性
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多