我只是想为学习目的制作一个小框架,我希望能够在对象上使用Array.prototype.forEach
,这就是我现在所拥有的,
var data = { test: 'test' };
Array.prototype.forEach(data, function(key value) {
console.log(key);
});
但我得到一个错误,我相信你们可以看到原因,但我不能:)所以任何帮助都会非常感谢:)
答案 0 :(得分:5)
对象不是数组,并且无权访问数组原型。你可以循环遍历这些属性。
for(var key in data){
console.log(key) //or data[key] if you want the values
}
关于下面的jQuery注释,看来它们在内部使用循环来实现“每个”功能。来自source:
// 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;
},
答案 1 :(得分:3)
如上所述,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);
});
答案 2 :(得分: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)
})
答案 3 :(得分:2)
只有当你的对象是类似数组时才会有效,这意味着它有数字键和length
:
var obj = { 0:"something", 1:"something else", length:2 };
Array.prototype.forEach.apply(obj, [function(element, i) {
console.log(i, element);
}]);
使用ES2015 +功能:
const obj = { 0:"something", 1:"something else", length:2 };
Array.from(obj).forEach((element, i) => {
console.log(i, element);
});
这对forEach
等内容使用FileList()
非常有用。
答案 4 :(得分:0)
您可以按for(key in data)
遍历对象键,并按data[key]
获取每个值。即。
for(key in object) {
console.log(key, data[key]);
}
答案 5 :(得分:0)
试试这个:
obj = {}; // Some object
obj.forEach = function(fn) {
Object.keys(this).forEach((k)=> {
if (typeof(this[k]) != 'function')
fn(this[k]);})
};