我试图理解迭代像object这样的数组:
var obj = {0:'a',1:'b'}
function logArgs(){
Array.prototype.forEach.call(arguments,function(elem,idx){
console.log(idx + '. ' + elem);
})
}
//now calling this fails:
logArgs(obj)
//logs
0. [object object]
但我想要一个这样的结果:
0. a
1. b
答案 0 :(得分:2)
它不是类似数组的对象,因为它错过了一个关键功能。 length
属性。
要遍历对象,您可以使用以下代码:
for (var key in obj) {
// Protect against inherited properties.
if (obj.hasOwnProperty(key)) {
console.log(key, obj[key]);
}
}
在ES5中,你可以这样做:
Object.keys(obj).forEach(
function(key) {
var val = obj[key];
console.log([key, val]);
}
);
重要提示
[1, 0]
。 答案 1 :(得分:1)
我会使用Object.keys()
请参阅fiddle
var obj = {0:'a',1:'b'}
var keys = Object.keys(obj);
keys.forEach(function(key){
console.log(key + '. ' + obj[key]);
});
在OP的功能中使用相同的逻辑。
var obj = {0:'a',1:'b'}
function logArgs(obj){
var keys = Object.keys(obj);
keys.forEach(function(key){
console.log(key + '. ' + obj[key]);
});
}
logArgs(obj)
日志:
0. a
1. b
答案 2 :(得分:1)
对象属性的常规迭代是这样的:
var obj = {'0':'a', '1':'b'};
for (var prop in obj) {
if (obj.hasOwnProperty(prop)) {
// property name is in prop
// value is in obj[prop]
console.log(prop + ": " + obj[prop]);
}
}
工作演示:http://jsfiddle.net/jfriend00/45jwx6zg/
请记住(根据语言规范)对象的属性不是任何保证顺序,所有属性名称都是字符串值。
您不能像对象一样直接迭代对象(即使是0,1,2 ... n作为属性的对象),因为它没有.length
属性。您可以(虽然我不知道为什么这会有用),使用Object.keys()
将对象的属性提取到数组中,然后将其用于迭代,但我不清楚为什么会有这些有用,而不仅仅是比所需要的更复杂的代码。
var obj = {'0':'a', '1':'b'};
Object.keys(obj).forEach(function(prop) {
console.log(prop + ": " + obj[prop]);
});
除非您想为密钥提供自定义排序,否则我看不出有任何理由这样做。 Object.keys()
也需要IE9或更高版本。
答案 3 :(得分:1)
要迭代传递给函数的每个对象参数的键,你需要这样的东西:
function logArgs(){
Array.prototype.forEach.call(arguments,function(elem,idx){
console.log("argument " + idx);
Object.keys(elem).forEach(function(key) {
console.log(" key " + key + ": " + elem[key]);
});
})
}
使用您的样本对象,即记录
argument 0
key 0: a
key 1: b
请注意,JavaScript中未定义使用for ... in
或Object.keys()
的对象属性名称的迭代顺序。每当您要求时,运行时环境都可以按字面随机顺序交付密钥。当然,它们不是,但编写依赖于它的代码是一个坏主意。