我有一个我简化的数据集:
var data = [{
size: 400
}, {
size: 500
}, {
size: 800
}, {
size: 400
}, {
size: 400
} {
size: 300
}, {
size: 300
}, {
size: 800
}];
var windowWidth = 800;
使用lo-dash我将如何根据windowWidth中适合的大小来创建一个新数组。 首选数据集将如下所示
var newArray = [{
group: [0],
size: 400
}, {
group: [1],
size: 500
}, {
group: [2],
size: 800
}, {
group: [3, 4],
size: 800
}, {
group: [5,6],
size: 600
}, {
group: [7],
size: 800,
}
密钥group
指的是满足窗口宽度较小条件的data[n]
索引。
键size
指的是组的累积大小。
注意:data[n]
只是计数并且不会重复,直到返回数据[0]。
data[n]
是否适合窗口内?
是?推动集体;转到data[n +1 ].size
;检查表达
没有?创建新组();转到数据[n +1] .size;检查表达
答案 0 :(得分:2)
var sum = _.chain(data).pluck('size').reduce(function(result, val, i) {
if (_.isEmpty(result) || val + _.last(result).size > windowWidth)
result.push({ size: val, groups: [i] });
else
{
var last = _.last(result);
last.size += val;
last.groups = last.groups || [];
last.groups.push(i);
}
return result;
}, []).value();
答案 1 :(得分:1)
看起来我想出了你需要的东西:
var data = [{size: 400}, {size: 500}, {size: 800}, {size: 400}, {size: 400}, {size: 300}, {size: 300}, {size: 800}],
newArray = [],
prevSize = 0,
lastIndex,
windowWidth = 800;
for(var i = 0; i < data.length; i++){
lastIndex = newArray.length - 1;
if(prevSize == data[i].size && (newArray[lastIndex].size + data[i].size < windowWidth)){
newArray[lastIndex].group.push(i);
newArray[lastIndex].size += data[i].size;
}else{
prevSize = data[i].size;
newArray.push({group:[i], size: data[i].size});
}
}
console.log(newArray);
alert(JSON.stringify(newArray));
答案 2 :(得分:1)
不确定这是否是最好的方法,但它只使用lodash函数:
var indexed = _.map(data, function (e, i) {
e['index'] = i;
return e
});
var grouped = _.groupBy(indexed, function (e) {
return e.size
});
var newArray = _.map(grouped, function (e, key) {
return {'size': key, 'group': _.pluck(e, 'index')}
});
使用_.reduce
进行分组的效率较低的版本,_.map
将分组对象转换为对象列表。过滤掉大于windowWidth
的所有尺寸。
var windowWidth = 400;
var grouped = _.reduce(data, function (result, e, i) {
if (e.size <= windowWidth) {
var group = result[e.size];
if (!group) {
group = result[e.size] = [];
}
group.push(i)
}
return result;
}, {});
var newArray = _.map(grouped, function (e, key) {
return {'size': key, 'group': e}
});
请参阅Demo