Javascript 数组对象按元素分组?

Javascript 数组对象按元素分组?,javascript,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, 'ti

我后面有一个数组对象

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'},
] ]
有人能帮我创建数组对象吗?
谢谢大家。

对于纯Javascript,我建议使用带有临时对象和

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

var x=[{'image\u url':'abc.jpg','device':1,'time':'2015-01-01'},{'image\u url':'eeed.jpg','device':2,'time':'2015-01-01'},{'image\u url':'sdfsf.jpg','device':1,'time':'2015-01-01'},{'image\url','vccxda.jpg','device,{'image_url':'sdfsgsfg.jpg','device':1','time':'2015-02-01'},
结果=功能(数据、组){
var r=[],
o={};
data.forEach(函数(a){
var k=group.map(函数(b){返回a[b];}).join('|');
如果(!(k in o)){
o[k]=[];
r、 推(o[k]);
}
o[k]。推(a);
});
返回r;
}(x,[‘装置’、‘时间’);

document.write(''+JSON.stringify(result,0,4)+'');
下划线允许您非常轻松地完成此操作:

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

//grouping by device
var sortedIdDevice = _.values(_.groupBy(x, function(ite){return ite.device}));
对您来说,使用对象操作这些排序数组会更容易

否则,您可以:

[Array[4], Array[2]]
为您提供所需的格式:

//grouping by device and date
var sortedIdDevice = _.values(_.groupBy(x, function(ite){return [ite.device, ite.time]}));
将数组传递给GroupBy允许您按多个字段分组:

[Array[3], Array[2], Array[1]]
返回您想要的内容:

y = _.values(_.groupBy(x, e => [e.device, e.time]))
请使用以下代码:

函数groupBy(数组,f)
{
变量组={};
array.forEach(函数(o)
{
var group=JSON.stringify(f(o));
组[组]=组[组]| |[];
组[组]。推送(o);
});
返回对象。键(组)。映射(函数(组)
{
返回组[组];
})
}
变量表=[
{'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(列表、函数(项)
{
返回[项目.设备,项目.时间];
});
console.dir(结果);
带lodash:

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]))
如果您不想要库,这些函数很容易模仿:

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

下面是一种使用array reduce函数的普通js方法


请添加分组规则。我认为他是按
设备
时间
进行分组的。请帮自己一个忙,完成本教程(第一部分与vanilla JavaScript相关)Ya,这是原始JS解决方案。但是为了完成这些任务,我认为人们应该考虑使用下划线/住宿。请在您的控制台中检查您的数组。我的函数是由任何字段按时间和DeCICLITE分组。我同意,输入不完全相同,我不知道它是否应该被否决。他有精确的输出
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);