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

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


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


当前回答

通常,如果您想要外推数组内的对象值(如问题中所述),那么可以使用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”]

其他回答

通常,如果您想要外推数组内的对象值(如问题中所述),那么可以使用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”]

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

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

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

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

Array.prototype.map文档

下面是对对象数组使用map方法获取特定属性的另一种形式:

const objArray=[{foo:1,bar:2},{foo:3,bar:4},{foo:5,bar:6}];const getProp=prop=>obj=>obj[prop];const getFoo=getProp('o');const fooes=objArray.map(getFoo);console.log(fooes);

从对象数组中解构并获取特定属性:

const customerList = dealerUserData?.partyDetails.map(
  ({ partyId, custAccountId }) => ({
    partyId,
    custAccountId,
    customerId: dealerUserData?._id,
    userId: dealerUserData?.authUserID,
  }),
);

从对象数组收集不同字段的示例

let inputArray=[{id:1,名称:“name1”,值:“value1”},{id:2,名称:“name2”,值:“value2”},];let ids=inputArray.map((item)=>item.id);let names=inputArray.map((item)=>item.name);let values=inputArray.map((item)=>item.value);console.log(id);console.log(名称);console.log(值);

结果:

[ 1, 2 ]
[ 'name1', 'name2' ]
[ 'value1', 'value2' ]