【问题标题】:How to split an array of objects into multiple normal arrays where each array is populated by one property's values?如何将一组对象拆分为多个普通数组,其中每个数组都由一个属性的值填充?
【发布时间】:2015-07-08 20:05:30
【问题描述】:

我有一个对象数组如下:

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

是否可以使用 lodash 或本机 javascript(不是 forEach)中的一些预定义函数将其拆分为 2 个数组。

["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);
});

但我正在寻找另一种方式。

【问题讨论】:

  • 你的方法不错……你为什么要寻找另一种方法?
  • forEach 有什么问题?您是否正在寻找一些开箱即用的方法来做到这一点?
  • forEach 没有任何问题。我只是想知道是否有另一个预定义的函数来完成相同的结果。

标签: javascript arrays lodash


【解决方案1】:

map()values()unzip() 组合成一个包装器:

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

那么就很容易抓到名字了:

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

和能力:

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

【讨论】:

  • +1 但请注意_values() 不保证顺序,因此根据代码要求,它可能无法使用。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    看起来没有什么比 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>

    【讨论】:

      【解决方案4】:

      您拥有的代码很好,但如果您正在寻找更“实用”的东西,总有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" ]
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-11
      • 1970-01-01
      • 1970-01-01
      • 2020-07-26
      • 1970-01-01
      • 2015-03-14
      • 1970-01-01
      相关资源
      最近更新 更多