cqwcns 发表于 2023-2-15 17:19

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]
                // ]

pjy612 发表于 2023-2-16 11:04

也没多优雅的 核心逻辑好像就那样了。。。

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);

fortytwo 发表于 2023-2-17 12:30

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:39

本帖最后由 liangyun 于 2023-2-21 10:49 编辑

> 为了避免改变原数组,加了...解构
这个还是会改变原数组的, 因为你这是浅拷贝

我写了一行比较长的代码, 简单测试了一下值没问题, 目测性能一般, 但是短{:301_997:}

obj.arrRank = obj.arrValue.map(() =>
    ).filter(it => it < score).length + 1)])
页: [1]
查看完整版本: JS指标值数组转排名数组的实现