首页 > 解决方案 > javascript对象数组添加排名但不更改主数组的顺序

问题描述

我想rank根据totalpremium值在每个元素上添加一个键(但我不想更改数组内对象的顺序),我当前的代码工作正常,但它改变了我没有的对象的主数组的顺序想做。

对象数组:

 [
  {
    totalcount: 2834682,
    totalpremium: 652553820
  },
  {
    totalcount: 1380674,
    totalpremium: 430713235
  },
  {
    totalcount: 862119,
    totalpremium: 165983898
  }
]

工作功能

// add rank to each object
function rank_by_key(array, key_name) {

    if (key_name) {

        array.sort(function (a, b) {
            return b[key_name] - a[key_name];
        });

        var rank = 1;
        for (var i = 0; i < array.length; i++) {
            if (i > 0 && array[i][key_name] < array[i - 1][key_name]) {
                rank++;
            }
            array[i].rank = rank;
        }
    }
    return array;
}


ranked_result = rank_by_key(array, 'totalpremium');

预期输出:

      [
        {
          "totalcount": 2834682,
          "totalpremium": 110,
          "rank": 2
        },
        {
          "totalcount": 1380674,
          "totalpremium": 121,
          "rank":1
        },
        {
          "totalcount": 862119,
          "totalpremium": 100,
          "rank": 3
        }
      ]
    

电流输出:

      [
        {
          "totalcount": 1380674,
          "totalpremium": 121,
          "rank":1
        },
        {
          "totalcount": 2834682,
          "totalpremium": 110,
          "rank": 2
        },
        {
          "totalcount": 862119,
          "totalpremium": 100,
          "rank": 3
        }
      ]
    

标签: javascriptarraysjavascript-objects

解决方案


这将创建一个排名数组,然后我们可以在创建新属性时引用它

let data = [
  {
    totalcount: 2834682,
    totalpremium: 652553820
  },
  {
    totalcount: 1380674,
    totalpremium: 43071324534435
  },
  {
    totalcount: 862119,
    totalpremium: 165983898
  }
]

let ranks = data.map(e => e.totalpremium).sort((a,b) => b-a)
let ranked = data.map( e=> ({...e, rank: (ranks.indexOf(e.totalpremium)+1)}));

console.log(ranked)


推荐阅读