数组对象按元素分组?

时间:2016-02-16 08:51:23

标签: javascript

我有一个数组对象

var x =[
{'image_url': 'abc.jpg', 'device': 1, 'time': '2015-01-01'},
{'image_url': 'eeed.jpg', 'device': 2, 'time': '2015-01-01'},
{'image_url': 'sdfsf.jpg', 'device': 1, 'time': '2015-01-01'},
{'image_url': 'vccxda.jpg', 'device': 2, 'time': '2015-01-01'},
{'image_url': 'sdfdsw.jpg', 'device': 1, 'time': '2015-01-01'},
{'image_url': 'sdfsgsfg.jpg', 'device': 1, 'time': '2015-02-01'}]

我想:

var results =[
[
    {'image_url': 'abc.jpg', 'device': 1, 'time': '2015-01-01'},
    {'image_url': 'sdfsf.jpg', 'device': 1, 'time': '2015-01-01'},
    {'image_url': 'sdfdsw.jpg', 'device': 1, 'time': '2015-01-01'}
],
[
    {'image_url': 'eeed.jpg', 'device': 2, 'time': '2015-01-01'},
    {'image_url': 'vccxda.jpg', 'device': 2, 'time': '2015-01-01'}
],
[
    {'image_url': 'sdfsgsfg.jpg', 'device': 1, 'time': '2015-02-01'},
] ]

有人可以帮我创建数组对象吗? 谢谢大家。

5 个答案:

答案 0 :(得分:2)

使用普通的Javascript,我建议使用带有临时对象的函数和Array.prototype.forEach()

  

forEach()方法每个数组元素执行一次提供的函数。

var x = [{ 'image_url': 'abc.jpg', 'device': 1, 'time': '2015-01-01' }, { 'image_url': 'eeed.jpg', 'device': 2, 'time': '2015-01-01' }, { 'image_url': 'sdfsf.jpg', 'device': 1, 'time': '2015-01-01' }, { 'image_url': 'vccxda.jpg', 'device': 2, 'time': '2015-01-01' }, { 'image_url': 'sdfdsw.jpg', 'device': 1, 'time': '2015-01-01' }, { 'image_url': 'sdfsgsfg.jpg', 'device': 1, 'time': '2015-02-01' }],
    result = function (data, group) {
        var r = [],
            o = {};
        data.forEach(function (a) {
            var k = group.map(function (b) { return a[b]; }).join('|');
            if (!(k in o)) {
                o[k] = [];
                r.push(o[k]);
            }
            o[k].push(a);
        });
        return r;
    }(x, ['device', 'time']);

document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');

答案 1 :(得分:2)

用lodash:

y = _.values(_.groupBy(x, e => [e.device, e.time]))

如果您不想要库,这些功能很容易模仿:

groupBy = function(a, f) {
    return a.reduce((o, e) => {
        var k = f(e);
        o[k] = (o[k] || []).concat(e);
        return o;
    }, {});
}

values = function(o) {
    return Object.keys(o).map(k => o[k]);
}

y = values(groupBy(x, e => [e.device, e.time]))

答案 2 :(得分:1)

下划线让你很容易做到:

var sortedIdDevice = _.groupBy(x, function(ite){return ite.device});

sortedIdDevice:

{1: Array[4], 2: Array[2]}

您可以更轻松地使用对象操作这些已排序的数组。

否则,你可以这样做:

//grouping by device
var sortedIdDevice = _.values(_.groupBy(x, function(ite){return ite.device}));

为您提供所需的格式:

[Array[4], Array[2]]

将数组传递给GroupBy允许您按多个字段分组:

//grouping by device and date
var sortedIdDevice = _.values(_.groupBy(x, function(ite){return [ite.device, ite.time]}));

准确地返回您想要的内容:

[Array[3], Array[2], Array[1]]

答案 3 :(得分:1)

使用数组reduce函数的vanilla js方法是

var x =[
{'image_url': 'abc.jpg', 'device': 1, 'time': '2015-01-01'},
{'image_url': 'eeed.jpg', 'device': 2, 'time': '2015-01-01'},
{'image_url': 'sdfsf.jpg', 'device': 1, 'time': '2015-01-01'},
{'image_url': 'vccxda.jpg', 'device': 2, 'time': '2015-01-01'},
{'image_url': 'sdfdsw.jpg', 'device': 1, 'time': '2015-01-01'},
{'image_url': 'sdfsgsfg.jpg', 'device': 1, 'time': '2015-02-01'}]
var mapping = [];
result = x.reduce(function (prev, current) {
    var key = current.device + '|' + current.time;
    var index = mapping.indexOf(key); 
    if ( index != -1) {
        prev[index].push(current);
    } else {
        mapping.push(key);
        prev.push([current]);
    }
    return prev;
}, []);
console.log(result);

答案 4 :(得分:0)

使用以下代码:

function groupBy( array , f )
{
  var groups = {};
  array.forEach( function( o )
  {
    var group = JSON.stringify( f(o) );
    groups[group] = groups[group] || [];
    groups[group].push( o );  
  });
  return Object.keys(groups).map( function( group )
  {
    return groups[group]; 
  })
}

var list =[
{'image_url': 'abc.jpg', 'device': 1, 'time': '2015-01-01'},
{'image_url': 'eeed.jpg', 'device': 2, 'time': '2015-01-01'},
{'image_url': 'sdfsf.jpg', 'device': 1, 'time': '2015-01-01'},
{'image_url': 'vccxda.jpg', 'device': 2, 'time': '2015-01-01'},
{'image_url': 'sdfdsw.jpg', 'device': 1, 'time': '2015-01-01'},
{'image_url': 'sdfsgsfg.jpg', 'device': 1, 'time': '2015-02-01'}];
var result = groupBy(list, function(item)
{
  return [item.device,item.time];
});

console.dir(result);