Назначение категорий на основе процентов в массиве javascript - PullRequest
1 голос
/ 01 августа 2020

У меня есть массив объектов (<{"SOME_LOCATION_ID": IT's VALUE}>), например:

let data = [{"12":132},{"229":133.84},{"174":137},{"2038":137.04},{"723":137.78},{"521":138.88},{"120":139.7},{"84":139.99},{"218":143.9},{"926":144.59},{"203":145.07},{"210":146.46},{"712":147.81},{"221":150.54},{"516":152.7},{"219":154.41},{"202":155.99},{"1018":158},{"199":158.63},{"230":158.81}];

У меня есть такой объект категорий:

const parts = {
    "Category1": 0.2,    // 20%
    "Category2": 0.2,    // 20%
    "Category3": 0.2,    // 20%
    "Category4": 0.2,    // 20%
    "Category5": 0.1,    // 10%
    "Category6": 0.1     // 10%
};

//All these add upto 1 (100%)

I хочу получить мой вывод в виде массива объектов, который выглядит примерно так, проценты в комментариях

[
    {"12":132, "category": "Category1"},                // First 20%
    {"229":133.84, "category": "Category1"},            // First 20%
    {"174":137, "category": "Category1"},               // First 20%
    {"2038":137.04, "category": "Category1"},           // First 20%
    {"723":137.78, "category": "Category2"},            // Second 20%
    {"521":138.88, "category": "Category2"},            // Second 20%
    {"120":139.7, "category": "Category2"},             // Second 20%
    {"84":139.99, "category": "Category2"},             // Second 20%
    {"218":143.9, "category": "Category3"},             // Third 20%
    {"926":144.59, "category": "Category3"},            // Third 20%
    {"203":145.07, "category": "Category3"},            // Third 20%
    {"210":146.46, "category": "Category3"},            // Third 20%
    {"712":147.81, "category": "Category4"},            // Fourth 20%
    {"221":150.54, "category": "Category4"},            // Fourth 20%
    {"516":152.7, "category": "Category4"},             // Fourth 20%
    {"219":154.41, "category": "Category4"},            // Fourth 20%
    {"202":155.99, "category": "Category5"},            // Fifth 10%
    {"1018":158, "category": "Category5"},              // Fifth 10%
    {"199":158.63, "category": "Category6"},            // Sixth 10%
    {"230":158.81, "category": "Category6"}             // Sixth 10%
]

В этом примере всего 20 объектов в исходном массиве. Что я могу сделать, чтобы сказать, имеет ли он нечетное количество объектов (например, нечетное количество объектов, например, 23 или 57, и т. Д. c.)

1 Ответ

1 голос
/ 01 августа 2020

Вот другой подход:

let data = [{"12":132},{"229":133.84},{"174":137},{"2038":137.04},{"723":137.78},{"521":138.88},{"120":139.7},{"84":139.99},{"218":143.9},{"926":144.59},{"203":145.07},{"210":146.46},{"712":147.81},{"221":150.54},{"516":152.7},{"219":154.41},{"202":155.99},{"1018":158},{"199":158.63},{"230":158.81}];

const parts = {
    "Category1": 0.2,    // 20%
    "Category2": 0.2,    // 20%
    "Category3": 0.2,    // 20%
    "Category4": 0.2,    // 20%
    "Category5": 0.1,    // 10%
    "Category6": 0.1     // 10%
};

let result = []; // holds the result
let cnt = data.length; // store initial length
let takeCnt; // counter for the items to take from the data array for each category

for(key in parts){ //iterate over the categories
    takeCnt = Math.ceil(cnt*parts[key]); //calculate how many items we take
    for(let x=0; x<takeCnt; x++){ //iterate over the data
        resultItem = data.pop(); //take and remove the item
        if(resultItem){
            resultItem[key] = parts[key]; //create result object
            result.push(resultItem); //assign result to final array
        }
    }
}

console.log(result);

И вот скрипка, чтобы поиграть с ним: https://jsfiddle.net/Postlagerkarte/pcqbfx8t/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...