我有一个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 obj = {value1: "val1", value2: "val2", Ndb_No: "testing", myVal: undefined};
var keysFiltered = Object.keys(obj).filter(function(item){return !(item == "Ndb_No" || obj[item] == undefined)});
var valuesFiltered = keysFiltered.map(function(item) {return obj[item]});
https://jsfiddle.net/ohea7mgk/
上述答案适用于单个属性,但当从数组中选择多个财产时,请使用以下选项
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)
通常,如果您想要外推数组内的对象值(如问题中所述),那么可以使用reduce、map和数组析构函数。
ES6
let a = [{ z: 'word', c: 'again', d: 'some' }, { u: '1', r: '2', i: '3' }];
let b = a.reduce((acc, obj) => [...acc, Object.values(obj).map(y => y)], []);
console.log(b)
循环中使用的等效值为:
for (let i in a) {
let temp = [];
for (let j in a[i]) {
temp.push(a[i][j]);
}
array.push(temp);
}
生成的输出:[“word”、“again”、“some”、“1”、“2”、“3”]
查看Lodash的_.pulling()函数或Undercore的_.plus()函数。两者都可以在一个函数调用中实现您想要的功能!
var result = _.pluck(objArray, 'foo');
更新:从Lodash v4.0.0起,_.pulling()已被删除,支持_.map(),并与Niet的答案类似。pickle()在Undercore中仍然可用。
更新2:正如Mark在评论中指出的,在Lodash v4和4.3之间的某个地方,添加了一个新功能,再次提供了该功能。property()是一个速记函数,它返回用于获取对象中属性值的函数。
此外,_.map()现在允许将字符串作为第二个参数传入,并将其传入_.property()。因此,以下两行相当于前面Lodash 4中的代码示例。
var result = _.map(objArray, 'foo');
var result = _.map(objArray, _.property('foo'));
_.property()和_.map()也允许您提供点分隔的字符串或数组,以便访问子属性:
var objArray = [
{
someProperty: { aNumber: 5 }
},
{
someProperty: { aNumber: 2 }
},
{
someProperty: { aNumber: 9 }
}
];
var result = _.map(objArray, _.property('someProperty.aNumber'));
var result = _.map(objArray, _.property(['someProperty', 'aNumber']));
上述示例中的两个_.map()调用都将返回[5,2,9]。
如果您对函数式编程有更多了解,请查看Ramda的R.pulp()函数,它看起来像这样:
var result = R.pluck('foo')(objArray); // or just R.pluck('foo', objArray)