将数据分成 n 组,按一些数字 属性 分布
Divide data into n groups distributed by some numeric property
假设我有以下数据样本。
[
{ _id: "1", weight: 3 },
{ _id: "2", weight: 3 },
{ _id: "3", weight: 4 },
{ _id: "4", weight: 1.5 }
]
我想获取此数据,并将其除以 属性 weight
,使其与每组中的 属性 保持平衡。在这种情况下,最终结果应该是这样的:
groupByProperty(fakeData, 2, 'weight');
[
[{ _id: "1", weight: 3}, { _id: "2", weight: 3}], // total: 6
[{ _id: "3", weight: 4}, {_id: "4", weight: 1.5}] // total: 5.5
]
也就是说每组的权重尽量similar/homogenous。是否有捷径可寻?我玩弄了一些 lodash 来完成它
groupByProperty = function (data, divisions, property) {
let compartments = _.range(divisions);
_.each(fakeData, (d) => {
_(compartments)
.sortBy((i) => _.sum(_.pluck(i, 'weight')))
.reverse()
.first()
.push(product);
});
return compartments;
}
没有真正起作用,但这是一个开始。
如何将数据分成 n 组,由 属性 在 javascript 中分布?
函数:
function groupByProperty(data, divisions, field) {
divisions = Math.round(divisions);
var l = data.length;
if(divisions <= 0 || l < divisions) {
return data;
} else {
var out = [];
for(var i = 0; i < divisions; i++){
out.push([]);
}
data = _.sortBy(data, function(p){return -p[field];});
for(var i = 0; i < l; i++){
var record = data[i];
out = _.sortBy(out, function(p){return _.reduce(p, function(memo, x){return memo + x[field];}, 0);});
out[0].push(record);
}
return out;
}
};
测试函数:
var result = groupByProperty(data, 2, 'weight');
console.log(result);
for(var i = 0; i < result.length; i++){
console.log(_.reduce(result[i], function(memo, p){ return memo + p.weight;}, 0));
}
第 2、3、4 个分区的结果:
5.5, 6
4.5, 3, 4
1.5, 3, 3, 4
已用:_.sortBy()
& _.reduce()
Original article on Russian (for php)
假设我有以下数据样本。
[
{ _id: "1", weight: 3 },
{ _id: "2", weight: 3 },
{ _id: "3", weight: 4 },
{ _id: "4", weight: 1.5 }
]
我想获取此数据,并将其除以 属性 weight
,使其与每组中的 属性 保持平衡。在这种情况下,最终结果应该是这样的:
groupByProperty(fakeData, 2, 'weight');
[
[{ _id: "1", weight: 3}, { _id: "2", weight: 3}], // total: 6
[{ _id: "3", weight: 4}, {_id: "4", weight: 1.5}] // total: 5.5
]
也就是说每组的权重尽量similar/homogenous。是否有捷径可寻?我玩弄了一些 lodash 来完成它
groupByProperty = function (data, divisions, property) {
let compartments = _.range(divisions);
_.each(fakeData, (d) => {
_(compartments)
.sortBy((i) => _.sum(_.pluck(i, 'weight')))
.reverse()
.first()
.push(product);
});
return compartments;
}
没有真正起作用,但这是一个开始。
如何将数据分成 n 组,由 属性 在 javascript 中分布?
函数:
function groupByProperty(data, divisions, field) {
divisions = Math.round(divisions);
var l = data.length;
if(divisions <= 0 || l < divisions) {
return data;
} else {
var out = [];
for(var i = 0; i < divisions; i++){
out.push([]);
}
data = _.sortBy(data, function(p){return -p[field];});
for(var i = 0; i < l; i++){
var record = data[i];
out = _.sortBy(out, function(p){return _.reduce(p, function(memo, x){return memo + x[field];}, 0);});
out[0].push(record);
}
return out;
}
};
测试函数:
var result = groupByProperty(data, 2, 'weight');
console.log(result);
for(var i = 0; i < result.length; i++){
console.log(_.reduce(result[i], function(memo, p){ return memo + p.weight;}, 0));
}
第 2、3、4 个分区的结果:
5.5, 6
4.5, 3, 4
1.5, 3, 3, 4
已用:_.sortBy()
& _.reduce()
Original article on Russian (for php)