JS指标值数组转排名数组的实现
首先我们有一个各省份的多项指标值,5列,即一共是5个指标。需求是根据这个格式,计算各省对应指标的排名。
以下代码功能已实现,分享一下。
各位大佬如果有优化建议或更优雅的写法,欢迎拍砖,谢谢
let obj = {
arrValue: [
['广东省', '0.400143678', '0.921666149', '0.9197356', '0.04875', '0.04047619'],
['北京市', '0.429216867', '0.968006563', '0.873073436', '0.04465383', '0.03539823'],
['上海市', '0.375123396', '0.933398153', '0.894736842', '0.036930179', '0.037974684'],
['四川省', '0.457677165', '0.96251802', '0.943161634', '0.024539877', '0.030120482'],
['台湾省', '0.421784473', '0.943089431', '0.906382979', '0.03414264', '0.022900763']
],
arrRank: [
['广东省'],
['北京市'],
['上海市'],
['四川省'],
['台湾省']
]
};
// 遍历arrValue第一个元素
for (let i = 0; i < obj.arrValue.length; i++) {
// 忽略第一列
if (i) {
// 排序(为了避免改变原数组,加了...解构)
let arrSort = [...obj.arrValue].sort((a, b) => a - b);
// 提取一列城市名称为数组,得到排序好的城市名称
arrSort = arrSort.map(item => item);
// 遍历arrRank
obj.arrRank.forEach(element => {
// 添加排名
element.push(arrSort.indexOf(element) + 1)
});
}
};
console.log('obj.arrRank', obj.arrRank);
// [
// ["广东省", 2, 1, 4, 5, 5],
// ["北京市", 4, 5, 1, 4, 3],
// ["上海市", 1, 2, 2, 3, 4],
// ["四川省", 5, 4, 5, 1, 2],
// ["台湾省", 3, 3, 3, 2, 1]
// ] 也没多优雅的 核心逻辑好像就那样了。。。
ps.偷懒用了 lodash....
let arrRank = [...obj.arrValue];
for (let i = 0; i < arrRank.length; i++) {
// 忽略第一列
if (i) {
let rankDict = Object.fromEntries(_.orderBy(arrRank,row=>row).map((row,rank)=>(,rank+1])));
arrRank.forEach((row)=>{
row=rankDict];
});
}
};
console.log(arrRank); obj = {
arrValue: [
['广东省', '0.400143678', '0.921666149', '0.9197356', '0.04875', '0.04047619'],
['北京市', '0.429216867', '0.968006563', '0.873073436', '0.04465383', '0.03539823'],
['上海市', '0.375123396', '0.933398153', '0.894736842', '0.036930179', '0.037974684'],
['四川省', '0.457677165', '0.96251802', '0.943161634', '0.024539877', '0.030120482'],
['台湾省', '0.421784473', '0.943089431', '0.906382979', '0.03414264', '0.022900763']
],
arrRank: [
['广东省'],
['北京市'],
['上海市'],
['四川省'],
['台湾省']
]
}
const values = obj.arrValue;
const ranks = obj.arrRank;
const n = values.length;
const m = values.length - 1;
const rankIndex = new Array(n);
// 初始化rankIndex
for (let i = 0; i < n; i++) {
rankIndex = i;
}
// 按照各项指标对省份数组进行排序
for (let j = m; j >= 1; j--) {
rankIndex.sort((a, b) => values - values);
let rank = 1;
let currentValue = values];
for (let i = 0; i < n; i++) {
const index = rankIndex;
if (values !== currentValue) {
rank = i + 1;
currentValue = values;
}
for (let k = 0; k < m + 1; k++) {
values = ];
}
values = rank;
}
}
// 将数组中每个元素转换为数字
for (let i = 0; i < n; i++) {
for (let j = 1; j < m + 1; j++) {
values = Number(values);
}
}
// 构造结果数组
const result = new Array(n);
for (let i = 0; i < n; i++) {
const row = new Array(m + 1);
for (let j = 0; j < m + 1; j++) {
row = values;
}
result = row;
}
console.log(result);
本帖最后由 liangyun 于 2023-2-21 10:49 编辑
> 为了避免改变原数组,加了...解构
这个还是会改变原数组的, 因为你这是浅拷贝
我写了一行比较长的代码, 简单测试了一下值没问题, 目测性能一般, 但是短{:301_997:}
obj.arrRank = obj.arrValue.map(() =>
).filter(it => it < score).length + 1)])
页:
[1]