首页 > 解决方案 > 根据 javascript 数组中的百分比分配类别

问题描述

我有一个对象数组(<{"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%)

我想将我的输出作为一个对象数组,看起来像这样,评论中的百分比

[
    {"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 等),我该怎么办?

标签: javascriptarrays

解决方案


这是另一种方法:

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/


推荐阅读