如何将对象数组拆分为多个普通数组,其中每个数组由一个 属性 的值填充?
How to split an array of objects into multiple normal arrays where each array is populated by one property's values?
我有一个对象数组如下:
var GOM = [{name:"Kuroko",ability:"misdirection"},
{name:"Kise",ability:"perfect copy"},
{name: "Akashi", ability: "emperor's eye"}];
是否可以使用 lodash 或本机中的一些预定义函数将其拆分为 2 个数组 javascript(不是 forEach)。
["Kuroko","Kise","Akashi"] and ["misdirection","perfect copy","emperor's eye"]
我知道我可以做到这一点:
var names = [];
var abilities = [];
GOM.forEach(function(member){
names.push(member.name);
abilities.push(member.ability);
});
但我正在寻找另一种方式。
Array.map()
适用于此:
var GOM = [{name:"Kuroko",ability:"misdirection"},{name:"Kise",ability:"perfect copy"},{name: "Akashi", ability: "emperor's eye"}];
var names = GOM.map(function(item) {
return item.name;
});
var abilities = GOM.map(function(item) {
return item.ability;
});
alert(names + '\n' + abilities);
您的代码很好,但是如果您正在寻找更多的东西 "functional," 总有 reduce
:
var GOM = [ { name: "Kuroko", ability: "misdirection" },
{ name: "Kise", ability: "perfect copy" },
{ name: "Akashi", ability: "emperor's eye" } ];
var result = GOM.reduce(function(memo, member) {
memo.names.push(member.name);
memo.abilities.push(member.ability);
return memo;
}, { names: [], abilities: [] });
console.log(result.names);
// => [ "Kuroko", "Kise", "Akashi" ]
console.log(result.abilities);
// => [ "misdirection", "perfect copy", "emperor's eye" ]
看起来没有比来自 lodash 的两个 pluck 更短的了:
var data = [
{name:"Kuroko",ability:"misdirection"},
{name:"Kise",ability:"perfect copy"},
{name: "Akashi", ability: "emperor's eye"}
];
var names = _.pluck(data, 'name');
var abilities = _.pluck(data, 'ability');
alert(JSON.stringify(names, null, 4));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.0/lodash.js"></script>
将map(), values(), and unzip()组合成包装器:
var wrapper = _(GOM).map(_.values).unzip();
然后就很容易抢到名字了:
wrapper.first()
// → [ "Kuroko", "Kise", "Akashi" ]
和能力:
wrapper.last()
// → [ "misdirection", "perfect copy", "emperor's eye" ]
我有一个对象数组如下:
var GOM = [{name:"Kuroko",ability:"misdirection"},
{name:"Kise",ability:"perfect copy"},
{name: "Akashi", ability: "emperor's eye"}];
是否可以使用 lodash 或本机中的一些预定义函数将其拆分为 2 个数组 javascript(不是 forEach)。
["Kuroko","Kise","Akashi"] and ["misdirection","perfect copy","emperor's eye"]
我知道我可以做到这一点:
var names = [];
var abilities = [];
GOM.forEach(function(member){
names.push(member.name);
abilities.push(member.ability);
});
但我正在寻找另一种方式。
Array.map()
适用于此:
var GOM = [{name:"Kuroko",ability:"misdirection"},{name:"Kise",ability:"perfect copy"},{name: "Akashi", ability: "emperor's eye"}];
var names = GOM.map(function(item) {
return item.name;
});
var abilities = GOM.map(function(item) {
return item.ability;
});
alert(names + '\n' + abilities);
您的代码很好,但是如果您正在寻找更多的东西 "functional," 总有 reduce
:
var GOM = [ { name: "Kuroko", ability: "misdirection" },
{ name: "Kise", ability: "perfect copy" },
{ name: "Akashi", ability: "emperor's eye" } ];
var result = GOM.reduce(function(memo, member) {
memo.names.push(member.name);
memo.abilities.push(member.ability);
return memo;
}, { names: [], abilities: [] });
console.log(result.names);
// => [ "Kuroko", "Kise", "Akashi" ]
console.log(result.abilities);
// => [ "misdirection", "perfect copy", "emperor's eye" ]
看起来没有比来自 lodash 的两个 pluck 更短的了:
var data = [
{name:"Kuroko",ability:"misdirection"},
{name:"Kise",ability:"perfect copy"},
{name: "Akashi", ability: "emperor's eye"}
];
var names = _.pluck(data, 'name');
var abilities = _.pluck(data, 'ability');
alert(JSON.stringify(names, null, 4));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.0/lodash.js"></script>
将map(), values(), and unzip()组合成包装器:
var wrapper = _(GOM).map(_.values).unzip();
然后就很容易抢到名字了:
wrapper.first()
// → [ "Kuroko", "Kise", "Akashi" ]
和能力:
wrapper.last()
// → [ "misdirection", "perfect copy", "emperor's eye" ]