javascript - 根据 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 等),我该怎么办?
解决方案
这是另一种方法:
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/
推荐阅读
- c# - 如何根据角距离舍入/捕捉方向矢量?
- python - 推送到heroku时应用程序与buildpack不兼容
- angular - 如何使用 Angular 在模块文件中进行 REST 调用
- c++ - 将值传递给函数模板的最佳方法
- css - 达到一定大小时的网站设置宽度
- python - 配置文件的 href 属性在创建 Django 时显示空字符串
- php - 如何在 PHP 中循环遍历 sql sum 结果?
- ruby-on-rails - 由于 ruby 版本错误,无法推送/部署到 heroku?
- angular - 在 forEach 方法中对对象数组进行排序(自然排序)
- java - 使用自定义适配器过滤自定义 ListView 时出现崩溃和 nullPointer