const colors = [
{ primary: '#AAAAAA', secondary: '#AAABBB' },
{ primary: '#BBBBBB', secondary: '#BBBCCC' },
{ primary: '#CCCCCC', secondary: '#CCCDDD' },
{ primary: '#DDDDDD', secondary: '#DDDEEE' },
]; // ЦВЕТА ВСЕГДА В НУЖНОМ ПОРЯДКЕ
const DATASETS = [
{
data: [1, 2, 3, 4, 5],
},
{
data: [2, 3, 4, 5, 6],
},
{
data: [3, 4, 5, 6, 7],
},
]; // МАССИВ МОЖЕТ БЫТЬ ОГРОМНЫМ, ДАННЫЕ ТОЖЕ
const OBJ_WITH_SUM_OF_VALUES_OF_DATA = {};
DATASETS.forEach((dataset, index) => {
OBJ_WITH_SUM_OF_VALUES_OF_DATA[index] = dataset.data.reduce((a, b) => a + b, 0); // создаем объект с суммами данных, для понимания порядка убывания и распределения цветов (может быть есть решение лучше)
});
const NEW_OBJ_WITH_COLORS_ON_DATA = {
// здесь должны быть объекты по типу => {
// OBJ_WITH_SUM_OF_VALUES_OF_DATA[index]: colors[НАИБОЛЬШЕЕ ЗНАЧЕНИЕ СУММЫ ПОЛУЧАЕТ ПЕРВЫЙ ЦВЕТ, ДАЛЬШЕ ПО УБЫВАНИЮ]
// }
}; // то что не понятно
const NEW_DATASETS = DATASETS.map(dataset => {
return {
...dataset,
...NEW_OBJ_WITH_COLORS_ON_DATA,
};
}); /* нужный результат => [
{
data: [1, 2, 3, 4, 5],
primary: '#CCCCCC',
secondary: '#CCCDDD'
},
{
data: [2, 3, 4, 5, 6],
primary: '#BBBBBB',
secondary: '#BBBCCC'
},
{
data: [3, 4, 5, 6, 7],
primary: '#AAAAAA',
secondary: '#AAABBB'
},
]
*/
const datasetsSumIndex = new Map(DATASETS
.map(n => [ n, n.data.reduce((acc, m) => acc + m, 0) ])
.sort((a, b) => b[1] - a[1])
.map((n, i) => [ n[0], i ])
);
// в случае, если в DATASETS элементов больше, чем в colors,
// можно подставлять какое-то дефолтное значение
const defaultColor = { primary: '...', secondary: '...' };
const result = DATASETS.map(n => ({
...n,
...(colors[datasetsSumIndex.get(n)] ?? defaultColor),
}));
const sum = ({data}) => data.reduce((a, b) => a + b, 0);
const colors = [
{ primary: '#AAAAAA', secondary: '#AAABBB' },
{ primary: '#BBBBBB', secondary: '#BBBCCC' },
{ primary: '#CCCCCC', secondary: '#CCCDDD' },
{ primary: '#DDDDDD', secondary: '#DDDEEE' },
]; // ЦВЕТА ВСЕГДА В НУЖНОМ ПОРЯДКЕ
const DATASETS = [
{
data: [1, 2, 3, 4, 5],
},
{
data: [2, 3, 4, 5, 6],
},
{
data: [3, 4, 5, 6, 7],
},
]; // МАССИВ МОЖЕТ БЫТЬ ОГРОМНЫМ, ДАННЫЕ ТОЖЕ
const NEW_DATASETS = DATASETS
.map((dataset, index) => [sum(dataset), index]) // получаем соответствие суммы индексу
.sort(([a],[b]) => b - a) // сортируем по сумме в обратном порядке
.map(([,sortedIndex], index) => ({
...DATASETS[index],
...colors[sortedIndex]
}));