从JavaScript对象中检索所有值

7
这是我编写的函数,用于检索给定对象中的所有值。
function getValues(data){
    var keys = Object.keys(data);
    var values = [];
    for(var i = 0, l = keys.length, key; i< l; i++){
        key = keys[i];
        values.push(data[key]);
    }
    return values;
}

有没有内置的方法来检索对象中的所有值?Java中的HashMaps存在这样的功能。我知道JS可以通过执行Object.keys(obj)来检索所有键的方法。


5
对于对象来说,for..in 似乎更加合适。 - Shomz
如果您正在使用下划线,则有一个values函数。 - Daniel A. White
不是纯JavaScript,但很容易实现。 - StackSlave
1
不好意思,没有内置的方法可以实现你所要求的功能。 - jfriend00
@squint,感谢您的审查,已经纠正了编码错误。对于值,您是正确的,但是对于键,它在for循环中定义... - mido
已删除,因为您进行了更新,所以现在可以删除key变量,因为它只使用了一次。data[keys[i]] - user1106925
2个回答

12

获取对象内包含的值的最简洁方法可能是使用 Object.keysArray.prototype.map

obj = {
    a: 1,
    b: 2,
    c: 3
};
values = Object.keys(obj).map(function (key) {
    return obj[key];
});

否则,没有标准化的方法来获取对象值的数组。
对于迭代,ES6引入了一个for..of循环,它将遍历对象的值: 上文继续:
for (value of obj) {
    console.log(value); //1, 2, 3
}

ES7计划引入数组推导式, 因此生成值数组的代码可以写成:

继续上文:
values = [for (x of Object.keys(obj)) obj[x]];

如果您已经在使用underscore,那么您可以使用_.values方法: 上文未完。
_.values(obj); //[1, 2, 3]

如果你只想要一个高效的实现这个实用函数,lodash source 就是:

lodash.js v2.4.1 的 2891-2914 行
/**
 * Creates an array composed of the own enumerable property values of `object`.
 *
 * @static
 * @memberOf _
 * @category Objects
 * @param {Object} object The object to inspect.
 * @returns {Array} Returns an array of property values.
 * @example
 *
 * _.values({ 'one': 1, 'two': 2, 'three': 3 });
 * // => [1, 2, 3] (property order is not guaranteed across environments)
 */
function values(object) {
  var index = -1,
      props = keys(object),
      length = props.length,
      result = Array(length);

  while (++index < length) {
    result[index] = object[props[index]];
  }
  return result;
}

2
另一个 ES6 的可能性:[for (x of Object.keys(obj)) obj[x]] - user1106925
@squint,难道不应该是[for (x of obj) x]吗? - zzzzBov
1
我不知道那是否已经计划好了。我现在只是在FF中进行测试,它告诉我这是一个语法错误。而且使用 [for (x of obj) x] 它告诉我 obj 不是一个迭代器。你知道它将会吗? - user1106925
多么可爱、深入、格式良好的答案。向您致敬,先生。 - GregL
1
值得注意的是,数组推导式已经在2014年8月的ES6提案中被移除(http://wiki.ecmascript.org/doku.php?id=harmony:specification_drafts#august_24_2014_draft_rev_27),现在计划将其包含在ES7中。 - yerforkferchips

1

在较新的浏览器中,你可以这样做:

Object.defineProperty(Object.prototype, 'values', {
  get:function(){
    return function(o){
      var a = [];
      for(var i in o){
        a.push(o[i]);
      }
      return a;
    }
  }
});
var arrayOfValues = Object.values({a:'A',b:'B',c:'C'});

"实际上,我只会这样做:

"
function objectValues(obj, inherited){
  var a = [];
  for(var i in obj){
    var v = obj[i];
    if(inherited){
      a.push(v);
    }
    else if(obj.hasOwnProperty(i)){
      a.push(v);
    }
  }
  return a;
}
var notInheritedArrayOfValues = objectValues({a:'A',b:'B',c:'C'});
var inheritedArrayOfValues = objectValues({a:'A',b:'B',c:'C'}, true);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接