我有一个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 ]

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


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


当前回答

如果还希望支持类似数组的对象,请使用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));

在处理对象数组时,函数映射是一个很好的选择。尽管已经发布了许多好的答案,但结合使用地图和过滤器的示例可能会有所帮助。

如果要排除值未定义的财产或只排除特定属性,可以执行以下操作:

    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/

通常,如果您想要外推数组内的对象值(如问题中所述),那么可以使用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或下划线,以确保跨浏览器。

在Lodash中,可以通过以下方法获取数组中属性的值

_.map(objArray,"foo")

和在Undercore

_.pluck(objArray,"foo")

两者都会回归

[1, 2, 3]

如果您有嵌套数组,则可以使其工作方式如下:

常量objArray=[{id:1,项:{foo:4,条:2}},{id:2,项:{foo:3,条:2}},{id:3,项:{foo:1,条:2}}];let result=objArray.map(({id,items:{foo}})=>({id,foo}))console.log(结果)