Javascript 将对象键值迭代为数组

Javascript 将对象键值迭代为数组,javascript,Javascript,我试图理解迭代类似数组的对象: 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 var

我试图理解迭代类似数组的对象:

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
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]);
    }
}
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]);
    });
  })
}

我会使用
Object.keys()

请参阅

在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)
日志:


我会使用
Object.keys()

请参阅

在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
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]);
    }
}
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]);
    });
  })
}
工作演示:

请记住(根据语言规范),对象的属性没有任何保证的顺序,所有属性名称都是字符串值


不能像数组那样直接迭代对象(即使对象的属性为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或更高版本。

对象属性的通常迭代如下:

0. a
1. b
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]);
    }
}
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]);
    });
  })
}
工作演示:

请记住(根据语言规范),对象的属性没有任何保证的顺序,所有属性名称都是字符串值


不能像数组那样直接迭代对象(即使对象的属性为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或更高版本。

要迭代传递给函数的每个对象参数的键,您需要如下内容:

0. a
1. b
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]);
    }
}
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

请注意,通过对象属性名的迭代顺序,可以是
for。。。在
中或使用Object.keys()时,未在JavaScript中定义。运行时环境可以在您请求密钥时按随机顺序自由地移交密钥。当然,它们没有,但编写依赖于此的代码是一个坏主意。

要迭代传递给函数的每个对象参数的键,您需要如下内容:

0. a
1. b
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]);
    }
}
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
请注意,通过对象属性名的迭代顺序,可以是
for。。。在
中或使用Object.keys()时,未在JavaScript中定义。运行时环境可以在您请求密钥时按随机顺序自由地移交密钥。当然,它们没有,但编写依赖于此的代码是一个坏主意。

它不是一个类似数组的对象,因为它缺少一个关键特性。
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]
  • 正如@jfriend00所提到的,属性名是字符串。(数组也是如此,但数组往往会对您隐藏这一事实。)
它不是一个类似数组的对象,因为它缺少一个关键特性。
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]
  • 正如@jfriend00所提到的,属性名是字符串。(数组也是如此,但数组往往会对您隐藏这一事实。)

但您刚刚通过了一个参数。您的函数迭代
参数
;为什么您希望记录不止一件事情?它是loggin[object],但我希望是0。我知道您希望它是什么,但关键是您的代码在参数列表上迭代,而不是在每个参数的内容上迭代。但这就是我问这个问题的原因,谢谢你澄清:)但你刚刚通过了一个论点。您的函数迭代
参数
;为什么您希望记录不止一件事情?它是loggin[object],但我希望是0。我知道您希望它是什么,但关键是您的代码在参数列表上迭代,而不是在每个参数的内容上迭代。但这就是我问这个问题的原因,所以感谢您的澄清:)您的第二个选项将生成类似
0,0
1,1
的输出。必须返回到实际对象才能获取属性值。@jfriend00 Arg,是。我专注于正确的语法,但没有检查输出。谢谢现在修复。您的第二个选项将生成输出,如
0,0
1,1
。必须返回到实际对象才能获取属性值。@jfriend00 Arg,是。我专注于正确的语法,但没有检查输出。谢谢现在修好。