我有一个JavaScript对象数组,其结构如下:

objArray = [ { foo: 1, bar: 2}, { foo: 3, bar: 4}, { foo: 5, bar: 6} ];

我想从每个对象中提取一个字段,并获得一个包含值的数组,例如,字段foo将给出数组[1,3,5]。

我可以用这种简单的方法做到这一点:

function getFields(input, field) {
    var output = [];
    for (var i=0; i < input.length ; ++i)
        output.push(input[i][field]);
    return output;
}

var result = getFields(objArray, "foo"); // returns [ 1, 3, 5 ]

是否有更优雅或更惯用的方法来实现这一点,从而不需要自定义实用程序函数?


注意建议的重复,它介绍了如何将单个对象转换为数组。


当前回答

是的,但它依赖于JavaScript的ES5特性。这意味着它在IE8或更高版本中不起作用。

var result = objArray.map(function(a) {return a.foo;});

在ES6兼容的JS解释器上,为了简洁起见,可以使用箭头函数:

var result = objArray.map(a => a.foo);

Array.prototype.map文档

其他回答

如果你甚至不知道你正在玩的对象的确切属性,我只会改进其中一个答案:

let result = objArray.map(a => a[Object.getOwnPropertyNames(a)]);

如果您希望ES6+中有多个值,以下操作将起作用

objArray = [ { foo: 1, bar: 2, baz: 9}, { foo: 3, bar: 4, baz: 10}, { foo: 5, bar: 6, baz: 20} ];

let result = objArray.map(({ foo, baz }) => ({ foo, baz }))

这是因为左边的{foo,baz}使用对象析构函数,而右边的箭头由于ES6的增强的对象文本而相当于{foo:foo,baz:baz}。

如果还希望支持类似数组的对象,请使用array.from(ES2015):

Array.from(arrayLike, x => x.foo);

与Array.prototype.map()方法相比,它的优点是输入也可以是Set:

let arrayLike = new Set([{foo: 1}, {foo: 2}, {foo: 3}]);

创建一个空数组,然后对列表中的每个元素,将该对象中所需的内容推送到空数组中。

 let objArray2 = [];
 objArray.forEach(arr => objArray2.push(arr.foo));

使用Array.prototype.map:

function getFields(input, field) {
    return input.map(function(o) {
        return o[field];
    });
}

有关ES5之前版本浏览器的垫片,请参阅上面的链接。