Javascript 如何在对象上使用Array.prototype.forEach?

Javascript 如何在对象上使用Array.prototype.forEach?,javascript,prototype,Javascript,Prototype,我只是想做一个学习用的小框架,我想能够在对象上使用Array.prototype.forEach,这就是我现在拥有的 var data = { test: 'test' }; Array.prototype.forEach(data, function(key value) { console.log(key); }); 但是我得到一个错误,我相信你们可以理解为什么,但我不能:)所以任何帮助都将非常感谢:)对象不是数组,并且没有访问数组原型的权限。您可以在属性上循环 for(var

我只是想做一个学习用的小框架,我想能够在对象上使用
Array.prototype.forEach
,这就是我现在拥有的

var data = { test: 'test' };

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

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

对象不是数组,并且没有访问数组原型的权限。您可以在属性上循环

for(var key in data){
      console.log(key) //or data[key] if you want the values
   }
关于下面的jQuery注释,它们似乎在内部为“each”函数使用循环。从:

//参数仅供内部使用
每个:函数(对象、回调、参数){
var值,
i=0,
长度=对象长度,
isArray=isArraylike(obj);
如果(args){
如果(isArray){
对于(;i
对象不是数组,无法访问数组原型。您可以在属性上循环

for(var key in data){
      console.log(key) //or data[key] if you want the values
   }
关于下面的jQuery注释,它们似乎在内部为“each”函数使用循环。从:

//参数仅供内部使用
每个:函数(对象、回调、参数){
var值,
i=0,
长度=对象长度,
isArray=isArraylike(obj);
如果(args){
如果(isArray){
对于(;i
您可以通过
为(输入数据)
迭代对象键,并通过
数据[key]
获取每个值。即

for(key in object) {
    console.log(key, data[key]);
}

您可以通过
for(输入数据)
遍历对象键,并通过
data[key]
获取每个值。即

for(key in object) {
    console.log(key, data[key]);
}
这样做:

Object.keys(data).forEach(function(key) {
    console.log(data[key])
});
objEach(data, function(val, key) {
    console.log(key, val)
})
obj = { "test1": 1, "test2": 2 };
obj.forEach(function(key, val) { 
    console.log(key, val); 
});
如果需要,可以为旧浏览器填充
Object.keys()


如果愿意,可以为此操作生成包装函数:

function objEach(obj, fn) {
    Object.keys(obj).forEach(function(key) {
        fn(obj[key], key)
    })
    // or use for-in
}
然后像这样使用它:

Object.keys(data).forEach(function(key) {
    console.log(data[key])
});
objEach(data, function(val, key) {
    console.log(key, val)
})
obj = { "test1": 1, "test2": 2 };
obj.forEach(function(key, val) { 
    console.log(key, val); 
});
这样做:

Object.keys(data).forEach(function(key) {
    console.log(data[key])
});
objEach(data, function(val, key) {
    console.log(key, val)
})
obj = { "test1": 1, "test2": 2 };
obj.forEach(function(key, val) { 
    console.log(key, val); 
});
如果需要,可以为旧浏览器填充
Object.keys()


如果愿意,可以为此操作生成包装函数:

function objEach(obj, fn) {
    Object.keys(obj).forEach(function(key) {
        fn(obj[key], key)
    })
    // or use for-in
}
然后像这样使用它:

Object.keys(data).forEach(function(key) {
    console.log(data[key])
});
objEach(data, function(val, key) {
    console.log(key, val)
})
obj = { "test1": 1, "test2": 2 };
obj.forEach(function(key, val) { 
    console.log(key, val); 
});

如上所述,对象和数组是不同的东西。通过使用“调用”进行调用,您可以创建一个函数来完成这项工作:

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);
        }
    }    
};
然后像这样使用它:

Object.keys(data).forEach(function(key) {
    console.log(data[key])
});
objEach(data, function(val, key) {
    console.log(key, val)
})
obj = { "test1": 1, "test2": 2 };
obj.forEach(function(key, val) { 
    console.log(key, val); 
});

如上所述,对象和数组是不同的东西。通过使用“调用”进行调用,您可以创建一个函数来完成这项工作:

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);
        }
    }    
};
然后像这样使用它:

Object.keys(data).forEach(function(key) {
    console.log(data[key])
});
objEach(data, function(val, key) {
    console.log(key, val)
})
obj = { "test1": 1, "test2": 2 };
obj.forEach(function(key, val) { 
    console.log(key, val); 
});
通过ES2017,有:

对于ES5,有:

如果您的对象类似数组(意味着它有数字键和
长度
),则有ES2015:

通过ES2017,有:

对于ES5,有:

如果您的对象类似数组(意味着它有数字键和
长度
),则有ES2015:

试试这个:

obj = {}; // Some object
obj.forEach = function(fn) {
    Object.keys(this).forEach((k)=> {
        if (typeof(this[k]) != 'function') 
            fn(this[k]);})
        };
试试这个:

obj = {}; // Some object
obj.forEach = function(fn) {
    Object.keys(this).forEach((k)=> {
        if (typeof(this[k]) != 'function') 
            fn(this[k]);})
        };

我假设“为什么?”是因为对象不是数组。匿名函数中的参数也有语法错误。我假设“为什么?”是因为对象不是数组。您的匿名函数中的参数也有语法错误。这是可行的,我只是认为jQuery是用它们的$实现的。每个使用foreach原型的函数我认为您将数组的foreach方法与此工作中的for循环混淆了,我只是认为jQuery是用他们的$实现的。每个函数都使用foreach原型。我认为你把数组的foreach方法和for-in循环混淆了为什么这是被否决的?有人能解释一下这种方法的问题吗?想象一下,如果您需要解析一个充满数组的巨大JSON blob。在for中的数组上使用.forEach。。。in-loop将导致任何JS linter抛出一个合适的值。和使用嵌套的。。。in循环变得很快,因为声明的所有变量的作用域都是周围的函数。键和值参数可能应该反转以匹配每个原型的数组。为什么这是向下投票?有人能解释一下这种方法的问题吗?想象一下,如果您需要解析一个充满数组的巨大JSON blob。在for中的数组上使用.forEach。。。in-loop将导致任何JS linter抛出一个合适的值。并使用嵌套