对象数组按多个属性权重排序,中括号与点号取对象属性的差别

tech2023-02-18  99

近期在大屏项目中产品对项目中柱状图的排序提出要求,首先按成绩(排序指标随意)从高到低排序,如果成绩相同按年龄从小到大排,针对该需求对后端返回的无序数据进行重排,直接上用例:

需要排序的数据例如:

    let = arr: [

        {name: '尼古拉斯1', age: 2, score: 89},

        {name: '尼古拉斯2', age: 6, score: 81},

        {name: '尼古拉斯3', age: 4, score: 90},

        {name: '尼古拉斯4', age: 2, score: 78},

        {name: '尼古拉斯5', age: 7, score: 85},

        {name: '尼古拉斯6', age: 7, score: 92},

        {name: '尼古拉斯6', age: 3, score: 85},

        {name: '尼古拉斯7', age: 2, score: 59},

        {name: '尼古拉斯8', age: 9, score: 100}

      ]

  function boubleSort (parmas1, parmas2) { // parmas1, parmas2为排序指标参数(此用例中就指代‘成绩’和‘年龄’)

      return function (a, b) {

        if (a.parmas1 === b.parmas1) return b.parmas2 - a.parmas2

        return a.parmas1 - b.parmas1

      }

    }

   console.log(arr.sort(boubleSort ('score', 'age'))) // 看到网上有该种失误写法

这里有误的原因就是没有分清‘[]’和‘.’取对象属性值时的要求,

点操作符: 静态 不能是字符串

中括号操作符: 动态 可以是字符串

正确写法应该如下

    function boubleSort2 (parmas1, parmas2) { // parmas1, parmas2为排序指标参数(此用例中就指代‘成绩’和‘年龄’)

      return function (a, b) {

        if (a[parmas1] === b[parmas1]) return b[parmas2] - a[parmas2]

        return a[parmas1] - b[parmas1]

      }

    }

 console.log(arr.sort(boubleSort2 ('score', 'age')))  // 分数为第一排序规则,年龄为第二排序规则

最新回复(0)