2015-07-08 2 views
3

У меня есть массив объектов следующим образом:Как разбить массив объектов на несколько нормальных массивов, где каждый массив заполнен значениями одного свойства?

var GOM = [{name:"Kuroko",ability:"misdirection"}, 
      {name:"Kise",ability:"perfect copy"}, 
      {name: "Akashi", ability: "emperor's eye"}]; 

Можно ли разбить его на 2 массивы, используя некоторые предопределенные функции в lodash или родной 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); 
}); 

, но я ищу другой путь.

+0

Ваш не плохой способ ... по какой причине вы ищете другой способ? – gypsyCoder

+0

Что случилось с 'forEach'? Вы ищете какой-то метод вне коробки, который делает это? – rgbchris

+0

Нет ничего плохого в forEach. Мне просто интересно, есть ли другая предопределенная функция для достижения того же результата. –

ответ

2

Похоже, нет ничего короче, чем два отрывных от lodash:

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>

3

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);

2

код у вас есть только штраф, но если вы ищете что-то более "функциональный" всегда есть 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" ] 
+0

Итак, второй параметр сокращения создает и инициализирует свойства по аргументам первой функции? –

+0

Да, это правильно. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce –

4

комбинат map(), values() и unzip() в обертку:

var wrapper = _(GOM).map(_.values).unzip(); 

Тогда легко захватить имена:

wrapper.first() 
// → [ "Kuroko", "Kise", "Akashi" ] 

и способности:

wrapper.last() 
// → [ "misdirection", "perfect copy", "emperor's eye" ] 
+0

+1, но имейте в виду, что ['_values ​​()'] (https://lodash.com/ docs #) не гарантирует порядок, поэтому он может не использоваться в зависимости от требований к коду. – dave

Смежные вопросы