我有一个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 ]
是否有更优雅或更惯用的方法来实现这一点,从而不需要自定义实用程序函数?
注意建议的重复,它介绍了如何将单个对象转换为数组。
上述答案适用于单个属性,但当从数组中选择多个财产时,请使用以下选项
var arrayObj=[{Name,'A',Age:20,Email:'a.gmail.com'},{Name,'B',Age:30,Email:'b.gmail.com'},{Name,'C',Age:40,Email:'c.gmail.com'}]
现在我只选择两个字段
var outPutArray=arrayObj.map(( {Name,Email} ) => ({Name,Email}) )
console.log(outPutArray)
谈到纯JS的解决方案,我发现,尽管它可能很不优雅,但简单的索引for循环比它的替代方案更具性能。
从100000个元素数组中提取单个属性(通过jsPerf)
传统循环368操作/秒
var vals=[];
for(var i=0;i<testArray.length;i++){
vals.push(testArray[i].val);
}
ES6用于。。循环303操作/秒
var vals=[];
for(var item of testArray){
vals.push(item.val);
}
Array.prototype.map 19操作/秒
var vals = testArray.map(function(a) {return a.val;});
TL;DR-.map()很慢,但如果您觉得可读性比性能更重要,可以使用它。
编辑#2:6/2019-jsPerf链接断开,已删除。
上述答案适用于单个属性,但当从数组中选择多个财产时,请使用以下选项
var arrayObj=[{Name,'A',Age:20,Email:'a.gmail.com'},{Name,'B',Age:30,Email:'b.gmail.com'},{Name,'C',Age:40,Email:'c.gmail.com'}]
现在我只选择两个字段
var outPutArray=arrayObj.map(( {Name,Email} ) => ({Name,Email}) )
console.log(outPutArray)