如何高效地按键重建和分组数组

How to efficiently reconstruct and group an array by key

有谁知道最有效 loadash 或underscore.js 方法来按对象键对对象数组进行分组,然后根据分组?例如,我有一个汽车对象数组:

    var cars = [

        {
            'make': 'audi',
            'model: 'r8',
            'year': '2012'
        },
        {
            'make': 'audi',
            'model: 'rs5',
            'year': '2013'
        },
        {
            'make': 'ford',
            'model: 'mustang',
            'year': '2012'
        },
        {
            'make': 'ford',
            'model: 'fusion',
            'year': '2015'
        },
        {
            'make': 'kia',
            'model: 'optima',
            'year': '2012'
        },

    ];

我想创建一个新的汽车对象数组,这些对象按 keys:

分组
var cars = 
[{
        "title": "make",
        "data": [{
                "value": "audi"
            },
            {
                "value": "ford"
            },
            {
                "value": "kia"
            }
        ]
    },
    {
        "title": "model",
        "data": [{
                "value": "r8"
            },
            {
                "value": "rs5"
            },
            {
                "value": "mustang"
            },
            {
                "value": "fusion"
            },
            {
                "value": "optima"
            }
        ]
    },
    {
        "title": "year",
        "data": [{
                "value": "2012"
            },
            {
                "value": "2013"
            },
            {
                "value": "2015"
            }
        ]
    }
]

提前致谢!

你需要这样的东西。

 var cars =[
  {
    'make': 'audi',
    'model': 'r8',
    'year': '2012'
  },
  {
    'make': 'audi',
    'model': 'rs5',
    'year': '2013'
  },
  {
    'make': 'ford',
    'model': 'mustang',
    'year': '2012'
  }
];
var result = _.map(cars, car => _. pairs(car))

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

然后,根据需要对数组进行分组。

可能不是很有效但可读且直接的方法(没有 lodash 也没有下划线):

var cars = [
    {
        'make': 'audi',
        'model': 'r8',
        'year': '2012'
    },
    {
        'make': 'audi',
        'model': 'rs5',
        'year': '2013'
    },
    {
        'make': 'ford',
        'model': 'mustang',
        'year': '2012'
    },
    {
        'make': 'ford',
        'model': 'fusion',
        'year': '2015'
    },
    {
        'make': 'kia',
        'model': 'optima',
        'year': '2012'
    },

];

var res = [];
cars.forEach(car => {
    var keys = Object.keys(car);
    keys.forEach(key => {
        var obj = res.find(o => o.title === key);
        if (obj) {
            if (!obj.data.some(it => it.value === car[key])) {   
                obj.data.push( { value: car[key]} ); 
            }  
        } else {
            res.push( {title: key, data: []} );
        }
    });
});
console.log(res);

不需要 lodash 或下划线。检查我做的这个实现。

function GroupArray(array) {
  let result = {};
  array.forEach(function(item) {
    Object.keys(item).forEach(function(key) {
      if (!result[key]) result[key] = [];
      if (result[key].indexOf(item[key]) == -1) {
        result[key].push(item[key]);
      }
    });
  });
  return result;
}

var cars = [
        {
            'make': 'audi',
            'model': 'hello',
            'year': '2012'
        },
        {
            'make': 'audi',
            'model': 'rs5',
            'year': '2013'
        },
        {
            'make': 'ford',
            'model': 'mustang',
            'year': '2012'
        },
        {
            'make': 'ford',
            'model': 'fusion',
            'year': '2015'
        },
        {
            'make': 'kia',
            'model': 'optima',
            'year': '2012'
        },

    ];

console.log(GroupArray(cars));