function pack(dataInitial, args) {
const drop = args?.drop || [];
let data = dataInitial;
if (drop.length > 0) {
data = dataInitial.map((d) => {
const copy = Object.assign({}, d);
drop.forEach((key) => {
delete copy[key];
});
return copy;
});
}
const props = Object.keys(data[0]);
const groups = [];
props.forEach((prop) => {
groups.push([prop, d3.groups(data, (d) => d[prop])]);
});
const dataGrouped = groups;
const filtered = dataGrouped.filter((d) => d[1].length < data.length / 1.3);
filtered.forEach((d) => {
let maxIndex = 0;
let maxVal = 0;
d[1].forEach((arr, j) => {
if (arr[1].length > maxVal) {
maxIndex = j;
maxVal = arr[1].length;
}
});
const temp = d[1][maxIndex];
d[1][maxIndex] = d[1][0];
d[1][0] = temp;
});
const jsonTables = {};
filtered.forEach((k) => {
jsonTables[k[0]] = k[1].map((d) => d[0]);
});
const indexMap = {};
filtered.forEach((k) => {
indexMap[k[0]] = {};
k[1].forEach((d, i) => {
indexMap[k[0]][d[0]] = !i ? "" : i.toString(36);
});
});
const replaced = data.map((d) => Object.assign({}, d));
replaced.forEach((row) => {
filtered.forEach((key) => {
const val = row[key[0]];
row[key[0]] = indexMap[key[0]][val];
});
});
const columns = Object.keys(replaced[0]);
const sizeFriendly = d3.csvFormat(replaced);
const finalData = Object.assign({
data: sizeFriendly,
metadata: jsonTables,
version: "36 base pack"
});
return finalData;
}