【问题标题】:How to get all values of a Javascript Object by its keys?如何通过键获取 Javascript 对象的所有值?
【发布时间】:2016-08-21 10:27:51
【问题描述】:

我有一个带有一些键和值的 Javascript 对象:

var obj = { 
    "key1" : "val1", 
    "key2" : "val2", 
    "key3" : "val3", 
    "key4" : ""
}

我想迭代所有键并检索所有值。

我尝试了两种方法:

1) 使用 for(var key in keys)

var keys = Object.keys(obj);
for (var key in keys) {
    // ...
}

这个解决方案的问题是keys对象是一个数组,所以我必须使用obj[keys[key]]]。 不是很漂亮。

此外,检查“key4”,返回值为“0”而不是“”(空)。

2) 使用 forEach

Object.keys(obj).forEach(function(key){
    // ...
});

这种情况下的问题是,如果我尝试这样做:

Object.keys(obj).forEach(function(key){
    obj[key];  // <- obj is undefined !!
});

“obj”变量在 foreach 中未定义!

迭代所有键以检索所有值的最佳方法是什么?

谢谢

【问题讨论】:

标签: javascript arrays json object


【解决方案1】:

只需使用for in

var obj = { 
  "key1" : "val1", 
  "key2" : "val2", 
  "key3" : "val3", 
  "key4" : ""
};

for (var key in obj) {

  console.log(key); // key1 and etc...
  console.log(obj[key]); // val1 and etc...
}

【讨论】:

  • 请注意,这是危险的,因为 T.J. Crowder 说,因为它还将迭代任何继承的属性。例如,如果您执行Object.prototype.foo = "bar",它将迭代五次而不是四次。
  • 您可以使用Object.hasOwnProperty() 保护这个for in 循环,它会检查给定属性是否未被继承。
【解决方案2】:

在您的第一个示例中,您使用for-in 循环遍历数组,这通常不是一个好主意。要遍历数组,this answer 有很多选项供您选择。

如果您想遍历对象的所有键,请在 对象上使用for-in

for (var key in obj) {
    var value = obj[key];
    // ...
}

请注意,您将看到对象的自己的 属性以及它从其原型继承的属性。如果你只想拥有属性,你可以添加一个守卫:

for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
        var value = obj[key];
        // ...
    }
}

...或使用Object.keys(在 2009 年的 ES5 中引入,因此不在 IE8 上;如果您需要支持过时的浏览器,例如 IE8,可以使用 shim):

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

在这两种情况下,您只会获得对象的 可枚举 属性。如果您需要包含不可枚举属性,请联系getOwnPropertyNames

Object.getOwnPropertyNames(obj).forEach(function(key) {
    var value = obj[key];
    // ...
});

这将获得对象自己的(不是继承的)属性名称,即使它们是不可枚举的,只要它们是字符串(它们总是在 ES5 及更早版本中;在 ES2015 及更高版本中,它们通常是字符串,但如果您使用Symbols,也可以是Symbol 实例。

getOwnPropertyNames也是在ES5中引入的,但是我觉得不能shimed,所以不能在IE8或者其他过时的浏览器中使用。

【讨论】:

    【解决方案3】:

    Object.values() 将提供对象属性值的数组。

     const object1 = {   a: 'somestring',   b: 42,   c: false };
    
    
     console.log(Object.values(object1)); // expected output: Array
    
     ["somestring", 42, false]
    

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

    【讨论】:

      【解决方案4】:

      使用 ES6,Object.keys(obj).map(key =&gt; obj[key]) 将返回一个包含所有值的数组。

      【讨论】:

        【解决方案5】:

        我比第二种方法更喜欢第一种方法,但不需要单独存储密钥。让我们考虑这个例子:

        function parseValues(obj, operation) {
            for (key in obj) {
                operation(obj[key], key);
            }
        }
        

        如您所见,我们不需要读取密钥。您可以将function 用于任何目的。例如:

        var myObject = {a: 1, b: 2, c: 3};
        
        parseValues(myObject, function(item, key) {
            if (key !== "b") {
                if (item > 1) {
                    myObject[key] = item * 2;
                }
            }
        });
        

        您可以通过多种方式使用它。在第二种方法中,forEach 为键运行,而不是为您正在解析其键的对象运行。正如 T.J.Crowther 已经指出的那样,您需要使用 getOwnPropertyNames

        【讨论】:

          【解决方案6】:

          奇怪的是你有这个 obj undefined 的问题,它不应该发生。 除了其他答案之外,这是另一种方式。 仅当您不需要过滤某些内容并且只想拥有一个包含所有值(和几行)的数组时,它才有用

          var values = []
            Object.keys(object)
              .every( (prop) => values.push(object[prop]))
          

          【讨论】:

          • 请在您的答案中添加解释。
          • 仅代码答案对社区不是很有用。请看How to Answer
          猜你喜欢
          • 2012-04-12
          • 2021-12-25
          • 2012-07-20
          • 2019-04-11
          • 2011-05-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多