我发现自己处于一个有趣的境地。我正在使用对象字面量来表示现实世界中的产品。现在,为了便于运输,每个产品都有一个与之关联的长度。它看起来像这样:
var product = {
name: 'MacBook Pro 15 Inch',
description: 'The new macbook pros....',
length: 15
height: 15
Weight: 4
}
这个这个运行得很好。但是对于长度未知的产品,它们的默认长度为-1。
同样,在您尝试执行此操作之前,此方法运行良好:
console.log('Product has the following properties');
_.each(product, function(val, key) {
console.log(key + ":" + val);
});
对于长度为-1
的产品,不会打印任何密钥。为什么?因为内部下划线使用长度属性,所以Javascript中的每个对象都必须遍历传入对象的所有属性。因为我们覆盖了这个值,所以它现在是-1
,并且因为我们从i = 0
开始循环,所以这个循环将永远不会被执行。
现在问题来了,如何防止length属性被覆盖?防止这种情况发生的最佳实践也将不胜感激。
发布于 2012-07-10 23:49:32
试试这个:
var product = {
name: "MacBook Pro 15 Inch",
description: 'The new macbook pros....',
length: 15,
height: 15,
weight: 4
};
console.log('Product has the following properties');
_.each(_.keys(product), function(key){
console.log(key + ":" + product[key]);
});
发布于 2012-07-10 23:45:15
这可能是由于_
的each
函数中的一些魔法,因为我怀疑它同时接受Object
s和Array
s。
简单的实现(避免了一些常见的陷阱):
function each(obj, map_func) {
var key;
for (key in obj) {
if (Object.prototype.hasOwnerProperty.call(obj, key)) {
map_func(key, obj[key]);
}
}
}
_
的each
中的魔力可能是由于JavaScript中一个讨厌的“习惯”,即拥有“看起来”像数组但实际上不是数组的东西,比如神奇的变量arguments
,我认为options
也在选择DOM元素中。
发布于 2012-07-10 23:47:30
我想不出任何可以超越它的东西。我认为使用长度属性是一种通过jQuery将其标记为可迭代的鸭子类型。
但是..。您可以不使用jQuery each方法,而以手动方式完成它。
通过简单地使用
for (key in product) {
}
你得到了你的基本循环。现在,如果您可能会覆盖对象的原型,则还应该检查product.hashOwnProperty( key ),以确保在产品实例中定义了您正在迭代的当前key。
现在,如果您还需要一个新的闭包作用域,这也非常简单。下面是每个函数的替代方法。
var myEach = function(subject, callback) {
for (key in subject) {
if (subject.hasOwnProperty(key)) {
callback(subject[key], key);
}
}
}
注:未测试。
https://stackoverflow.com/questions/11423556
复制相似问题