将对象键值迭代为数组

时间:2014-08-11 03:59:22

标签: javascript

我试图理解迭代像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

4 个答案:

答案 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]
  • 如@jfriend00所述,属性名称为 strings 。 (对于数组也是如此,但数组往往会隐藏这一事实。)

答案 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 ... inObject.keys()的对象属性名称的迭代顺序。每当您要求时,运行时环境都可以按字面随机顺序交付密钥。当然,它们不是,但编写依赖于它的代码是一个坏主意。