我有一个数组对象
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'},
] ]
有人可以帮我创建数组对象吗? 谢谢大家。
答案 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);