从JavaScript对象中检索所有值

时间:2014-11-14 01:31:33

标签: javascript

这是我为检索给定对象中的所有值而编写的函数。

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 for HashMaps中。我知道JS有一种方法可以通过Object.keys(obj)来检索所有密钥。

2 个答案:

答案 0 :(得分: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计划引入array comprehensions,因此生成values数组可以写成:

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

如果您已使用下划线,则可以使用_.values方法:

从上面继续:
_.values(obj); //[1, 2, 3]

如果您只想要有效实现此实用程序功能,lodash source是:

lodash.js v2.4.1 lines 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;
}

答案 1 :(得分: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);