【问题标题】:Access non-numeric Object properties by index?按索引访问非数字对象属性?
【发布时间】:2011-12-13 13:20:10
【问题描述】:

如果我有这样的数组:

var arr = ['one','two','three'];

我可以通过这样做访问不同的部分:

console.log(arr[1]);

如何按顺序而不是按键访问对象属性?

例子:

var obj = {
    'something' : 'awesome',
    'evenmore'  : 'crazy'
},
jbo = {
    'evenmore'  : 'crazy',
    'something' : 'awesome'
};

如何在不显式使用属性名称的情况下获取每个对象的第一个属性——obj 的“something”和jbo 的“evenmore”?

现在,你们中的一些人似乎认为我在追求类似的东西:

console.log(obj['something']);

情况并非如此,我特别希望以索引为目标,就像第一个示例一样 - 如果可能的话。

【问题讨论】:

  • “对象数组”是什么意思。数组一个对象。你的意思是一个不是数组的对象,还是一个对象数组。 jQuery 是如何影响您的问题的?您唯一的代码示例说明了您已经知道如何做的部分。如何提供一些说明问题的代码。
  • @Ӫ_._Ӫ 我标记 jQuery 的原因是为了获得更广泛的受众,我认为任何了解 jQuery 的人都必须了解数组,而不是与我的问题相矛盾,这是教科书的内容。
  • 其实我想说“知道” jQuery 而不知道 JavaScript 的人比相反的多(至少知道 JavaScript 的人应该能够轻松理解 jQuery)......并且尊重对于您的实际问题:不,您不能通过索引访问对象属性。它们不是有序的。
  • "...我认为任何了解 jQuery 的人都必须了解数组的..." 我不会打赌。
  • @Brogrammer:这个问题与jQuery无关,所以jQuery标签不合适。

标签: javascript arrays


【解决方案1】:
var obj = {
    'key1':'value',
    '2':'value',
    'key 1':'value'
}

console.log(obj.key1)
console.log(obj['key1'])
console.log(obj['2'])
console.log(obj['key 1'])

// will not work
console.log(obj.2)

编辑:

“我特别希望以索引为目标,就像第一个示例一样 - 如果可能的话。”

实际上“索引”是关键。如果你想存储一个键的位置,你需要创建一个自定义对象来处理这个。

【讨论】:

  • 我知道您可以通过密钥访问它,这不是我要问的。
  • @Brogrammer:您的问题模棱两可,所以这篇文章可能会按书面形式回答问题。
【解决方案2】:

“我特别希望以索引为目标,就像第一个示例一样 - 如果可能的话。”

不,这是不可能的。

你能得到的最接近的方法是获取对象键的数组,并使用它:

var keys = Object.keys( obj );

...但不能保证密钥会按照您定义的顺序返回。所以它最终可能看起来像:

keys[ 0 ];  // 'evenmore'
keys[ 1 ];  // 'something'

【讨论】:

【解决方案3】:

我能想到的唯一方法是创建一个使用Object.keys(); 为您提供属性的方法。

var obj = {
    dog: "woof",
    cat: "meow",
    key: function(n) {
        return this[Object.keys(this)[n]];
    }
};
obj.key(1); // "meow"

演示:http://jsfiddle.net/UmkVn/

可以使用Object.prototype; 将其扩展到所有对象,但通常不建议这样做。

改为使用函数助手:

var object = {
  key: function(n) {
    return this[ Object.keys(this)[n] ];
  }
};

function key(obj, idx) {
  return object.key.call(obj, idx);
}

key({ a: 6 }, 0); // 6

【讨论】:

  • 这很酷,就像一个魅力!为什么它不是公认的答案?您可能应该使用return this[Object.keys(this)[n]]; 使其通用。
  • 您好,从 2016 年开始,我们未来的人们仍然认为这应该是公认的答案。很好的解决方案
  • 之所以没有被接受的答案是因为直到 es6,Object.keys 的顺序是不能保证的。因此,即使该代码在少数 JS 引擎中工作,也不能保证在所有这些引擎中工作。 stackoverflow.com/questions/5525795/…
【解决方案4】:

如果你不确定 Object.keys() 是否会以正确的顺序返回给你的键,你可以试试这个逻辑

var keys = []
var obj = {
    'key1' : 'value1',
    'key2' : 'value2',
    'key3' : 'value3',
}
for (var key in obj){
    keys.push(key)
}
console.log(obj[keys[1]])
console.log(obj[keys[2]])
console.log(obj[keys[3]])

【讨论】:

    【解决方案5】:

    通过 jquery 你可以做到这一点:

    var arr = $.map(obj,function(value, key) {
        return value;
    });
    alert(obj[0]);
    

    【讨论】:

      【解决方案6】:

      如果您不想使用Object.keys(),可以使用Object.values() 方法。

      与返回给定对象自身可枚举属性数组的Object.keys() 方法相反,例如:

      const object1 = {
       a: 'somestring',
       b: 42,
       c: false
      };
      
      console.log(Object.keys(object1));
      

      将打印出以下数组:

      [ 'a', 'b', 'c' ]
      

      Object.values() 方法返回给定对象自己的可枚举属性的数组values

      因此,如果您有相同的对象但使用值代替,

      const object1 = {
       a: 'somestring',
       b: 42,
       c: false
      };
      
      console.log(Object.values(object1));
      

      你会得到以下数组:

      [ 'somestring', 42, false ]
      

      因此,如果您想访问object1.b,但使用索引,您可以使用:

      Object.values(object1)[1] === 42
      

      您可以阅读有关此方法的更多信息here

      【讨论】:

      • 本主题中建议的这种方法似乎是最短和最优雅的。
      【解决方案7】:

      获取键数组,反转它,然后运行循环

        var keys = Object.keys( obj ).reverse();
        for(var i = 0; i < keys.length; i++){
          var key = keys[i];
          var value = obj[key];
          //do stuff backwards
        }
      

      【讨论】:

        【解决方案8】:

        您可以创建一个填充了对象字段的数组,并在数组上使用索引并通过该索引访问对象属性

        propertiesName:['pr1','pr2','pr3']
        
        this.myObject[this.propertiesName[0]]
        

        【讨论】:

          【解决方案9】:

          我继续为你做了一个函数:

           Object.prototype.getValueByIndex = function (index) {
               /*
                   Object.getOwnPropertyNames() takes in a parameter of the object, 
                   and returns an array of all the properties.
                   In this case it would return: ["something","evenmore"].
                   So, this[Object.getOwnPropertyNames(this)[index]]; is really just the same thing as:
                   this[propertyName]
              */
              return this[Object.getOwnPropertyNames(this)[index]];
          };
          
          let obj = {
              'something' : 'awesome',
              'evenmore'  : 'crazy'
          };
          
          console.log(obj.getValueByIndex(0)); // Expected output: "awesome"

          【讨论】:

          • 您能解释一下您的方法正在做什么吗?
          • 我在代码中添加了一些cmets,这样你就可以明白做了什么。
          【解决方案10】:

          当然可以,但它不像通过索引访问数组那样直接,但实际上还是可以的,甚至相对简单:实际上你不必太费劲。此代码示例将展示如何:

          var obj = {
              'alfa'  : 'value of obj the key alfa',
              'beta'  : 'value of obj the key beta',
              'gamma'  : 'value of obj the key gamma'
          };
          
          var jbo = {
              'alfa'  : 'value of jbo the key alfa',
              'beta'  : 'value of jbo the key beta',
              'gamma'  : 'value of jbo the key gamma'
          };
          
          alert  ( obj[Object.keys(obj)[1]] );
          alert ( jbo[Object.keys(jbo)[1]] );
          
          /* you can even put it into a for loop as follows */
          
          for (i=0;i<3;i++)
          {
              document.writeln ( "<br>This could be even a piece of HTML: " + obj[Object.keys(obj)[i]] );
              document.writeln ( "<br>This could be even a piece of HTML: " + jbo[Object.keys(jbo)[i]] );
          }

          说明:

          如您所知,Object.keys() 语句返回您在圆括号中键入的对象的所有可枚举属性(即所有键)的数组。 因此,您唯一需要的是在该数组之后指示索引 ,这将返回在该索引处找到的键字面量。 键本身像往常一样被返回该键值的对象“消化”。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-12-10
            • 2015-07-04
            • 1970-01-01
            • 1970-01-01
            • 2017-04-23
            • 2011-05-01
            • 2010-12-12
            相关资源
            最近更新 更多