JavaScript如何对数组的对象里某个属性排序后,再根据最高的动态添加属性?

QQ图片20191119092750.png

[
                    {
                    score: 20,
                    name: '小红'
                },
                {
                    score: 100,
                    name: '小绿'
                }, {
                    score: 60,
                    name: '小明'
                }, {
                    score: 100,
                    name: '小天'
                }, {
                    score: 30,
                    name: '小赵'
                }
            ]
            如图,类似这样的结构,数据是动态后台传过来的,可能有多个第一名或者第二名第三名...
            score最高的也就是第一名添加属性ranking:'第1名',
             score第二高的添加属性ranking:'第2名'。
             如果能不改变数组结构的顺序就能达到效果最理想
            
阅读 2.1k
3 个回答
function addRank(arr) {
    let scoreList = [...new Set(arr.map(v => v.score))].sort((a,b) => b-a)
    let rankIndex = (score) => scoreList.findIndex((_score) => _score == score)
    arr.forEach(item => {
        item.ranking = `第${rankIndex(item.score) + 1}名`
    })
    return arr
}

用一个结构将分数和人信息(引用)保存起来:

info = {
    100: [{ score: 100, name: 小绿 }, { score: 100, name: 小明 } ]
}

然后提取key进行排序:
Object.keys(info).sort() 取出前2个分数。
再去info中查这些分数对应的人列表,都加上属性即可。

图片描述

demo([
  {
    score: 20,
    name: '小红'
  },
  {
    score: 100,
    name: '小绿'
  }, {
    score: 60,
    name: '小明'
  }, {
    score: 100,
    name: '小天'
  }, {
    score: 30,
    name: '小赵'
  }
])

function demo (arr) {
  var map = arr.reduce((group, item) => {
      if(!group.some(score => score === item.score)) {
        group.push(Number(item.score))
      }
      return group
    }, [])
    .sort((a, b) => a > b ? -1 : 1)
    .reduce((map, score, index) => {
      map[score] = index + 1
      return map
    }, {})
  arr.forEach(item => {
    item.ranking = `第${map[Number(item.score)]}名`
  })
  console.log('arr', arr)
  return arr
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题