代码之家  ›  专栏  ›  技术社区  ›  atogle

如何访问javascript中对象的第一个属性?

  •  476
  • atogle  · 技术社区  · 15 年前

    有没有一种优雅的方式来访问对象的第一个属性…

    1. 你不知道你的财产名称的地方
    2. 不用像这样的循环 for .. in 或jQuery的 $.each

    例如,我需要访问 foo1 不知道foo1名称的对象:

    var example = {
        foo1: { /* stuff1 */},
        foo2: { /* stuff2 */},
        foo3: { /* stuff3 */}
    };
    
    13 回复  |  直到 15 年前
        1
  •  1152
  •   Daniel Sokolowski    6 年前
    var obj = { first: 'someVal' };
    obj[Object.keys(obj)[0]]; //returns 'someVal'
    

    使用它,您还可以通过索引访问其他属性。请注意! Object.keys 根据ecmascript,退货单不一定能得到保证,但是所有主要浏览器的实现都是非正式的,请阅读 https://stackoverflow.com/a/23202095 有关详细信息。

        2
  •  97
  •   Gumbo    15 年前

    试试 for … in loop 在第一次迭代后中断:

    for (var prop in object) {
        // object[prop]
        break;
    }
    
        3
  •  43
  •   Community CDub    7 年前

    使用 Object.keys 获取对象的属性数组。例子:

    var example = {
        foo1: { /* stuff1 */},
        foo2: { /* stuff2 */},
        foo3: { /* stuff3 */}
    };
    
    var keys = Object.keys(example); // => ["foo1", "foo2", "foo3"] (Note: the order here is not reliable)
    

    提供文档和跨浏览器垫片 here . 我的另一个答案中有一个使用它的例子。 here .

    编辑 :为了清晰起见,我只想重复其他答案中正确说明的内容:javascript对象中的键顺序未定义。

        4
  •  27
  •   lovelikelando    8 年前

    你也可以这样做 Object.values(example)[0] .

        5
  •  20
  •   Quentin    15 年前

    没有“第一”属性。对象键无序。

    如果你用 (var foo in bar) 你会让他们进来的 一些 顺序,但以后可能会更改(尤其是添加或删除其他键时)。

        6
  •  20
  •   Nathan Arthur user2811108    7 年前

    一个规则版本:

    var val = example[function() { for (var k in example) return k }()];
    
        7
  •  9
  •   Alex Rozanski    15 年前

    不。对象文本,由定义 MDC 是:

    对象的零对或多对属性名和相关值的列表,用大括号()括起来。

    因此,对象文本不是数组,您只能使用其显式名称或 for 循环使用 in 关键字。

        8
  •  7
  •   pocheptsov    7 年前

    解决方案 lodash 图书馆:

    _.find(example) // => {name: "foo1"}
    

    但不能保证对象属性的内部存储顺序,因为它依赖于JavaScriptVM实现。

        9
  •  3
  •   Javier Cobos    11 年前

    我不建议您使用object.keys,因为它在旧的IE版本中不受支持。但如果您真的需要,可以使用上面的代码来保证后台兼容性:

    if (!Object.keys) {
    Object.keys = (function () {
    var hasOwnProperty = Object.prototype.hasOwnProperty,
        hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),
        dontEnums = [
          'toString',
          'toLocaleString',
          'valueOf',
          'hasOwnProperty',
          'isPrototypeOf',
          'propertyIsEnumerable',
          'constructor'
        ],
        dontEnumsLength = dontEnums.length;
    
    return function (obj) {
      if (typeof obj !== 'object' && typeof obj !== 'function' || obj === null) throw new TypeError('Object.keys called on non-object');
    
      var result = [];
    
      for (var prop in obj) {
        if (hasOwnProperty.call(obj, prop)) result.push(prop);
      }
    
      if (hasDontEnumBug) {
        for (var i=0; i < dontEnumsLength; i++) {
          if (hasOwnProperty.call(obj, dontEnums[i])) result.push(dontEnums[i]);
        }
      }
      return result;
    }})()};
    

    功能:Firefox(Gecko)4(2.0)Chrome 5 Internet Explorer 9 Opera 12 Safari 5

    更多信息: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/keys

    但如果您只需要第一个,我们可以安排一个较短的解决方案,如:

    var data = {"key1":"123","key2":"456"};
    var first = {};
    for(key in data){
        if(data.hasOwnProperty(key)){
            first.key = key;
            first.content =  data[key];
            break;
        }
    }
    console.log(first); // {key:"key",content:"123"}
    
        10
  •  2
  •   annakata    15 年前

    这一点以前已经在这里讨论过了。

    first的概念不适用于对象属性,for…in循环的顺序不受规范的保证,但是在实践中它是可靠的FIFO。 除了 对铬来说至关重要( bug report )做出相应的决定。

        11
  •  0
  •   Flavius Stef    15 年前

    如果您需要访问“对象的第一个属性”,这可能意味着您的逻辑有问题。对象属性的顺序应该不重要。

        12
  •  0
  •   steamer25    15 年前

    使用数组而不是对象(方括号)。

    var example = [ {/* stuff1 */}, { /* stuff2 */}, { /* stuff3 */}];
    var fist = example[0];
    

    请注意,您将丢失“foo”标识符。但可以向包含的对象添加名称属性:

    var example = [ 
      {name: 'foo1', /* stuff1 */},
      {name: 'foo2', /* stuff2 */},
      {name: 'foo3', /* stuff3 */}
    ];
    var whatWasFirst = example[0].name;
    
        13
  •  0
  •   jtr13    7 年前

    有什么理由不这么做吗?

    > example.map(x => x.name);
    
    (3) ["foo1", "foo2", "foo3"]