1

我只是想为学习目的制作一个小框架,我希望能够Array.prototype.forEach在对象上使用,这就是我现在所拥有的,

var data = { test: 'test' };

Array.prototype.forEach(data, function(key value) {
    console.log(key);
});

但我得到一个错误,我相信你们可以明白为什么,但我不能:)所以任何帮助都会非常感谢:)

4

6 回答 6

5

对象不是数组,也无权访问数组原型。您可以遍历属性。

for(var key in data){
      console.log(key) //or data[key] if you want the values
   }

关于下面的 jQuery 评论,他们似乎在内部为他们的“每个”函数使用循环。从来源

// args is for internal usage only
each: function( obj, callback, args ) {
    var value,
        i = 0,
        length = obj.length,
        isArray = isArraylike( obj );

    if ( args ) {
        if ( isArray ) {
            for ( ; i < length; i++ ) {
                value = callback.apply( obj[ i ], args );

                if ( value === false ) {
                    break;
                }
            }
        } else {
            for ( i in obj ) {
                value = callback.apply( obj[ i ], args );

                if ( value === false ) {
                    break;
                }
            }
        }

    // A special, fast, case for the most common use of each
    } else {
        if ( isArray ) {
            for ( ; i < length; i++ ) {
                value = callback.call( obj[ i ], i, obj[ i ] );

                if ( value === false ) {
                    break;
                }
            }
        } else {
            for ( i in obj ) {
                value = callback.call( obj[ i ], i, obj[ i ] );

                if ( value === false ) {
                    break;
                }
            }
        }
    }

    return obj;
},
于 2013-05-13T15:59:30.997 回答
4

如上所述,Object 和 Array 是不同的东西。您可以通过使用“call”进行调用来创建一个为您执行此操作的函数:

Object.prototype.forEach = function(func, context) {
    var value;
    context = context || this;  //apply the function to 'this' by default
    for (key in this) {
        if (this.hasOwnProperty(key)) {  //to rule out inherited properties
            value = this[key];
            func.call(context, key, value);
        }
    }    
};

并像这样使用它:

obj = { "test1": 1, "test2": 2 };
obj.forEach(function(key, val) { 
    console.log(key, val); 
});
于 2013-05-13T16:12:45.327 回答
2

使用 ES2017,有Object.entries()

const obj = { 0:'value1', key:'value2' };

Object.entries(obj).forEach(([key, value]) => {
    console.log(key, value);
});

对于 ES5,有Object.keys()

const obj = { 0:'value1', key:"value2" };

Object.keys(obj).forEach(key => {
    console.log(key, obj[key]);
});

如果您的对象是类似数组的(意味着它有数字键和 a length),则有 ES2015 的Array.from()

const obj = { 0:'value1', 1:'value2', length:2 };

Array.from(obj).forEach((element, i) => {
    console.log(i, element);
});
于 2014-09-17T17:36:59.240 回答
2

像这样做:

Object.keys(data).forEach(function(key) {
    console.log(data[key])
});

如果需要,您可以Object.keys()为旧浏览器填充垫片。


如果您愿意,可以为此操作创建一个包装函数:

function objEach(obj, fn) {
    Object.keys(obj).forEach(function(key) {
        fn(obj[key], key)
    })
    // or use for-in
}

然后像这样使用它:

objEach(data, function(val, key) {
    console.log(key, val)
})
于 2013-05-13T16:10:55.243 回答
0

您可以遍历对象键 byfor(key in data)并通过 获取每个值data[key]。IE

for(key in object) {
    console.log(key, data[key]);
}
于 2013-05-13T16:00:58.190 回答
0

尝试这个:

obj = {}; // Some object
obj.forEach = function(fn) {
    Object.keys(this).forEach((k)=> {
        if (typeof(this[k]) != 'function') 
            fn(this[k]);})
        };
于 2017-05-04T03:06:47.573 回答