Skip to content

Instantly share code, notes, and snippets.

@rihardn
Last active May 31, 2023 09:23
Show Gist options
  • Save rihardn/b3d7e5c7709d8e795db316d3f9e4da17 to your computer and use it in GitHub Desktop.
Save rihardn/b3d7e5c7709d8e795db316d3f9e4da17 to your computer and use it in GitHub Desktop.
Evenly, uniformly distribute array data
// var arr1 = ["A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "B", "B", "B", "C", "C", "C", "C", "D", "D", "E"];
// var arr1New = _evenlyDistribute(arr1);
// console.dir(arr1New.join());
// Should output: ABACABADABACABAEABACABADABACABA
var _evenlyDistribute = function (data) {
var _arrayMerge = function (a, b) {
var c1 = a.length;
var c2 = b.length;
var result = [];
var i1 = 0;
var i2 = 0;
while (i1 < c1) {
result.push(a[i1++]);
while (i2 < c2 && (i2 + 1) / (c2 + 1) < (i1 + 1) / (c1 + 1)) {
result.push(b[i2++]);
}
}
return result;
}
var groups = {};
for (var i = 0; i < data.length; i++) {
var slide = data[i];
if (groups[slide]) {
groups[slide].push(slide);
} else {
var sArr = [];
sArr.push(slide);
groups[slide] = sArr;
}
}
var slidesData = {};
for (var j = 0; j < data.length; j++) {
var slide = data[j];
if (slidesData[slide]) {
slidesData[slide] += 1;
} else {
slidesData[slide] = 1;
}
}
var sortable = [];
for (var slide in slidesData) {
sortable.push([slide, slidesData[slide]]);
}
sortable.sort(function (a, b) {
return a[1] - b[1];
});
var result = [];
for (var l = 0; l < sortable.length; l++) {
var cKey = sortable[l][0];
if (result.length == 0) {
result = groups[cKey];
} else if (result.length >= groups[cKey].length) {
result = _arrayMerge(result, groups[cKey]);
} else {
result = _arrayMerge(groups[cKey], result);
}
}
return result;
}
const arr1 = ["A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "B", "B", "B", "C", "C", "C", "C", "D", "D", "E"];
const arr1New = _evenlyDistribute(arr1);
console.dir(arr1New.join());
// Should output: ABACABADABACABAEABACABADABACABA
function _arrayMerge(a, b) {
let c1 = a.length;
let c2 = b.length;
let result = [];
let i1 = 0;
let i2 = 0;
while (i1 < c1) {
result.push(a[i1++]);
while (i2 < c2 && (i2 + 1) / (c2 + 1) < (i1 + 1) / (c1 + 1)) {
result.push(b[i2++]);
}
}
return result;
}
function _evenlyDistribute(data) {
let groups = {};
for (let i = 0; i < data.length; i++) {
let slide = data[i];
if (groups[slide]) {
groups[slide].push(slide);
} else {
let sArr = [];
sArr.push(slide);
groups[slide] = sArr;
}
}
let slidesData = {};
for (let j = 0; j < data.length; j++) {
let slide = data[j];
if (slidesData[slide]) {
slidesData[slide] += 1;
} else {
slidesData[slide] = 1;
}
}
let sortable = [];
for (let slide in slidesData) {
sortable.push([slide, slidesData[slide]]);
}
sortable.sort(function (a, b) {
return a[1] - b[1];
});
let result = [];
for (let l = 0; l < sortable.length; l++) {
let cKey = sortable[l][0];
if (result.length == 0) {
result = groups[cKey];
} else if (result.length >= groups[cKey].length) {
result = _arrayMerge(result, groups[cKey]);
} else {
result = _arrayMerge(groups[cKey], result);
}
}
return result;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment