【问题标题】:Analogue of every( ) for object in JavascriptJavascript中对象的every()的类比
【发布时间】:2015-06-10 19:02:18
【问题描述】:


我有一个函数,它检查两个 DOM 元素的计算样式属性值,如果每个属性都相等,它应该返回 true 或 false。

checkUserBlock: function (userBlockSelector, properties) {
        var checker = this.setCheckingStyle(userBlockSelector, properties);
        var userBlockCompStyle = getComputedStyle(this.getUserBlock(userBlockSelector));
        var checkBlockCompStyle = getComputedStyle(checker);
        var checkingStyle = this.parseCheckingStyle(properties);
        for(var key in checkingStyle){
            return (userBlockCompStyle.getPropertyValue([key].toString()) == checkBlockCompStyle.getPropertyValue([key].toString()));
        }
    }

我在返回所有属性的结果时遇到问题,我考虑了 every() 函数,但它仅适用于数组。我如何将它用于对象,或者您可以在没有 jQuery 的情况下提供不同的解决方案?

【问题讨论】:

    标签: javascript object for-loop


    【解决方案1】:

    你可以这样定义一个函数:

    function every(callback) { 
      for(prop in this) { if(!callback(this[prop])) return false; };
     return true;
    }
    

    你可以在一个对象上拍打它,它会遍历它的可枚举属性:

    var obj = {1: 1, b: 3, E: 4};
    Object.defineProperty(obj, 'every', { value: every, enumerable: false, writable: true, configurable: true });
    obj.every(function(item) { return item < 5; })
    //true
    obj.every(function(item) { return item < 1; })
    //false
    

    或者你可以修改 Object.prototype 给所有对象 every 方法:

    Object.defineProperty(Object.prototype, 'every', { value: every, enumerable: false, writable: true, configurable: true });
    

    如果您不希望每个都应用于原型继承的属性,您也可以使用 Object.getPropertyNames:

     function every(callback) { 
          var propertyNames = Object.getOwnPropertyNames(this);
          var length = propertyNames.length;
          for (var i=0; i < length; i++) {
             if(!callback(this[propertyNames[i]])) return false; 
          }
         return true;
     }
    

    您可以将它贴在对象的原型上,而不必担心使其变得数不胜数:

    var obj = Object.create({every: every}); 
    obj[1]=1; obj.b=3; obj.E=4;
    obj.every(function(item) { return item < 5; })
    //true
    obj.every(function(item) { return item < 1; })
    //false
    

    【讨论】:

    • 不,您不能像上一个示例那样,在不担心可枚举性的情况下将方法传递给 Object.prototype
    • @Bergi 感谢您的评论。我错误地认为 Object.getProrotypeOf({}) !== Object.prototype。我已经修复了最后一个示例,现在它有一个未共享的原型。
    【解决方案2】:

    这将为您提供一组属性名称,然后您可以对其进行迭代(改编自 https://stackoverflow.com/a/328418/4670652):

    function propertiesArray(obj) {
       var propList = [];
       for(var propName in obj) {
          if(typeof(obj[propName]) != "undefined") {
             propList.push(propName);
          }
       }
       return propList;
    }
    

    【讨论】:

    • 没有理由不使用Object.keys
    猜你喜欢
    • 2021-03-04
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-29
    • 2021-09-15
    相关资源
    最近更新 更多