首页 文章

如何获取Javascript对象的所有属性值(不知道密钥)?

提问于
浏览
413

如果有Javascript对象:

var objects={...};

假设它有超过50个属性,不知道属性名称(不知道'键')如何在循环中获取每个属性值?

20 回答

  • -1

    ES5 Object.keys

    var a = { a: 1, b: 2, c: 3 };
    Object.keys(a).map(function(key){ return a[key] });
    // result: [1,2,3]
    
  • -4

    使用

    console.log(variable)
    

    如果你使用谷歌浏览器打开控制台使用Ctrl Shift j

    转到>>控制台

  • -10

    根据您必须支持的浏览器,可以通过多种方式完成此操作 . 绝大多数浏览器都支持ECMAScript 5(ES5),但要注意下面的许多示例都使用 Object.keys ,这在IE <9中不可用 . 请参阅compatibility table .

    ECMAScript 3

    如果您必须支持旧版本的IE,那么这是您的选择:

    for (var key in obj) {
        if (Object.prototype.hasOwnProperty.call(obj, key)) {
            var val = obj[key];
            // use val
        }
    }
    

    嵌套的 if 确保您不会枚举对象原型链中的属性(这是您几乎肯定想要的行为) . 你必须使用

    Object.prototype.hasOwnProperty.call(obj, key) // ok
    

    而不是

    obj.hasOwnProperty(key) // bad
    

    因为ECMAScript 5允许您使用 Object.create(null) 创建无原型对象,并且这些对象不具有 hasOwnProperty 方法 . 顽皮的代码也可能产生覆盖 hasOwnProperty 方法的对象 .

    ECMAScript 5

    您可以在任何支持ECMAScript 5及更高版本的浏览器中使用这些方法 . 这些从对象获取值并避免枚举原型链 . obj 是你的对象:

    var keys = Object.keys(obj);
    
    for (var i = 0; i < keys.length; i++) {
        var val = obj[keys[i]];
        // use val
    }
    

    如果你想要一些更紧凑的东西,或者你想要小心循环中的函数,那么 Array.prototype.forEach 是你的朋友:

    Object.keys(obj).forEach(function (key) {
        var val = obj[key];
        // use val
    });
    

    下一个方法构建一个包含对象值的数组 . 这很方便循环 .

    var vals = Object.keys(obj).map(function (key) {
        return obj[key];
    });
    
    // use vals array
    

    如果你想使用 Object.keys 安全地对抗 null (因为 for-in 是),那么你可以做 Object.keys(obj || {})... .

    Object.keys 返回可枚举的属性 . 对于迭代简单对象,这通常就足够了 . 如果您有需要使用的非可枚举属性,可以使用 Object.getOwnPropertyNames 代替 Object.keys .

    ECMAScript 2015(A.K.A . ES6)

    使用ECMAScript 2015可以更容易地迭代数组 . 在循环中逐个处理值时,可以使用此优势:

    for (const key of Object.keys(obj)) {
        const val = obj[key];
        // use val
    }
    

    使用ECMAScript 2015 fat-arrow函数,将对象映射到值数组成为一个单行:

    const vals = Object.keys(obj).map(key => obj[key]);
    
    // use vals array
    

    ECMAScript 2015引入了 Symbol ,其实例可以用作属性名称 . 要获取要枚举的对象的符号,请使用 Object.getOwnPropertySymbols (此函数是 Symbol 不能用于创建私有属性的原因) . 来自ECMAScript 2015的新 Reflect API提供 Reflect.ownKeys ,它返回属性名称(包括不可枚举的)和符号的列表 .

    数组理解(不要尝试使用)

    在发布之前,数组理解是来自ECMAScript 6的 removed . 在删除之前,解决方案看起来像:

    const vals = [for (key of Object.keys(obj)) obj[key]];
    
    // use vals array
    

    ECMAScript 2017

    ECMAScript 2016添加了不影响此主题的功能 . ECMAScript 2017规范添加了 Object.valuesObject.entries . 两个返回数组(对于某些给定与 Array.entries 的类比,这将是令人惊讶的) . Object.values 可以按原样使用,也可以使用 for-of 循环 .

    const values = Object.values(obj);
    
    // use values array or:
    
    for (const val of Object.values(obj)) {
        // use val
    }
    

    如果您想同时使用键和值,那么 Object.entries 适合您 . 它生成一个填充 [key, value] 对的数组 . 您可以在 for-of 循环中使用它,或者(请注意ECMAScript 2015解构分配):

    for (const [key, val] of Object.entries(obj)) {
        // use key and val
    }
    

    Object.values shim

    最后,正如评论和teh_senaus在另一个答案中所指出的那样,使用其中一个作为垫片可能是值得的 . 别担心,以下不会改变原型,它只是添加一个方法 Object (这样危险性要小得多) . 使用fat-arrow函数,这也可以在一行中完成:

    Object.values = obj => Object.keys(obj).map(key => obj[key]);
    

    你现在可以使用它

    // ['one', 'two', 'three']
    var values = Object.values({ a: 'one', b: 'two', c: 'three' });
    

    如果你想避免当本机 Object.values 存在时填充,那么你可以这样做:

    Object.values = Object.values || (obj => Object.keys(obj).map(key => obj[key]));
    

    最后......

    请注意您需要支持的浏览器/版本 . 在实现方法或语言功能的地方,上述内容是正确的 . 例如,默认情况下,在V8中默认关闭对ECMAScript 2015的支持,直到最近才支持Chrome浏览器 . 应该避免ECMAScript 2015的功能,直到您打算支持的浏览器实现您需要的功能 . 如果使用babel将代码编译为ECMAScript 5,则可以访问此答案中的所有功能 .

  • 5

    现在我使用Dojo Toolkit因为旧浏览器不支持 Object.values .

    require(['dojox/lang/functional/object'], function(Object) {
        var obj = { key1: '1', key2: '2', key3: '3' };
        var values = Object.values(obj);
        console.log(values);
    });
    

    输出:

    ['1', '2', '3']
    
  • 0

    ECMA2017起:

    Object.values(obj) 会将所有属性值作为数组提取 .

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Object/values

  • 403

    这是一个类似于PHP的array_values()的函数

    function array_values(input) {
      var output = [], key = '';
      for ( key in input ) { output[output.length] = input[key]; }
      return output;
    }
    

    如果您使用的是ES6或更高版本,以下是获取对象值的方法:

    Array.from(values(obj));
    
  • 3

    通过使用简单的 for..in 循环:

    for(var key in objects) {
        var value = objects[key];
    }
    
  • 27

    这是一个可重用的函数,用于将值转换为数组 . 它也需要考虑原型 .

    Object.values = function (obj) {
        var vals = [];
        for( var key in obj ) {
            if ( obj.hasOwnProperty(key) ) {
                vals.push(obj[key]);
            }
        }
        return vals;
    }
    
  • 7

    如果您可以访问Underscore.js,则可以使用_.values函数,如下所示:

    _.values({one : 1, two : 2, three : 3}); // return [1, 2, 3]
    
  • 0

    使用如下的polyfill:

    if(!Object.values){Object.values=obj=>Object.keys(obj).map(key=>obj[key])}
    

    然后用

    Object.values(my_object)
    

    3)利润!

  • -8

    对于那些早期适应CofeeScript时代的人来说,这是另一个相当于它的人 .

    val for key,val of objects
    

    这可能比这更好,因为 objects 可以减少再次输入并降低可读性 .

    objects[key] for key of objects
    
  • 926

    我意识到'm a little late but here'是新的firefox 47 Object.values 方法的 shim

    Object.prototype.values = Object.prototype.values || function(obj) {
      return this.keys(obj).map(function(key){
        return obj[key];
      });
    };
    
  • 2

    与ES7兼容,即使某些浏览器还不支持它

    Object.values(<object>) 将内置 ES7

    在等待所有浏览器支持它之前,您可以将其包装在函数中:

    Object.vals=(o)=>(Object.values)?Object.values(o):Object.keys(o).map((k)=>o[k])
    

    然后 :

    Object.vals({lastname:'T',firstname:'A'})
     // ['T','A']
    

    一旦浏览器与ES7兼容,您就不必更改代码中的任何内容 .

  • 3

    使用: Object.values() ,我们传入一个对象作为参数,并接收一个值数组作为返回值 .

    这将返回给定对象拥有的可枚举属性值的数组 . 您将获得与使用 for in 循环相同的值,但没有Prototype上的属性 . 这个例子可能会让事情变得更加清晰:

    function person (name) {
      this.name = name;
    }
    
    person.prototype.age = 5;
    
    let dude = new person('dude');
    
    for(let prop in dude) {
      console.log(dude[prop]);     // for in still shows age because this is on the prototype
    }                              // we can use hasOwnProperty but this is not very elegant
    
    // ES6 + 
    console.log(Object.values(dude));
    // very concise and we don't show props on prototype
    
  • 28

    Object.entries以更好的方式完成它 .

    var dataObject = {"a":{"title":"shop"}, "b":{"title":"home"}}
     
       Object.entries(dataObject).map(itemArray => { 
         console.log("key=", itemArray[0], "value=", itemArray[1])
      })
    
  • 0
    var objects={...}; this.getAllvalues = function () {
            var vls = [];
            for (var key in objects) {
                vls.push(objects[key]);
            }
            return vls;
        }
    
  • 0

    如果你真的想要一个值数组,我发现这比使用for ... in循环构建一个数组更干净 .

    ECMA 5.1

    function values(o) { return Object.keys(o).map(function(k){return o[k]}) }
    

    值得注意的是,在大多数情况下,您并不真正需要一组值,执行此操作会更快:

    for(var k in o) something(o[k]);
    

    这将迭代Object o的键 . 在每次迭代中,k被设置为o的关键字 .

  • 1

    你可以循环键:

    foo = {one:1, two:2, three:3};
    for (key in foo){
        console.log("foo["+ key +"]="+ foo[key]);
    }
    

    将输出:

    foo[one]=1
    foo[two]=2
    foo[three]=3
    
  • 0

    ECMAScript5 使用

    keys = Object.keys(object);
    

    否则,如果您的浏览器不支持它,请使用着名的 for..in loop

    for (key in object) {
        // your code here
    }
    
  • 14

    显然 - 正如我最近学到的 - 这是最快的方法:

    var objs = {...};
    var objKeys = Object.keys(obj);
    for (var i = 0, objLen = objKeys.length; i < objLen; i++) {
        // do whatever in here
        var obj = objs[objKeys[i]];
    }
    

相关问题