问题描述
按照数据中love这个属性去排序,而且这个顺序必须是“乒乓球、羽毛球、篮球”排序
原始数据如下:
const data = [
{
name: '李',
love: '篮球'
},
{
name: '李',
love: '乒乓球'
},
{
name: '李',
love: '羽毛球'
},
{
name: '张',
love: '乒乓球'
},
{
name: '张',
love: '羽毛球'
},
{
name: '张',
love: '篮球'
},
{
name: '吴',
love: '羽毛球'
},
{
name: '吴',
love: '乒乓球'
},
]
需要的结果数据如下:
const data = [
{
name: '李',
love: '乒乓球'
},
{
name: '李',
love: '羽毛球'
},
{
name: '李',
love: '篮球'
},
{
name: '张',
love: '乒乓球'
},
{
name: '张',
love: '羽毛球'
},
{
name: '张',
love: '篮球'
},
{
name: '吴',
love: '乒乓球'
},
{
name: '吴',
love: '羽毛球'
},
]
从题主给的结果数据来看,并不是单纯的按
love
来排序,而是「先按name
再按love
的双重排序」,而且name
不是按字母序,而是按先后出现的顺序love
是按“乒乓球、羽毛球、篮球”的顺序其中,按
name
出现序需要提前遍历数组,把顺序排出来;或者在排的过程中来产生(因为是顺序,可以在过程中来产生)。下面这个例子是提前产生的
其中,生成
nameSerials
过程(IIFE 中)中的names
可以简单地用一句话产生虽然(可能仅在某些环境下)效果还是如预期,但是
Set
本身不应保证排序,所以不同的 JS Runtime 实现有可能不同,所以不这样用。另一种方法,在过程中产生
nameSerials
,其实就是在取序数的时候,检查如果这个name
不存在于集合中,就把它保存进去,映射到一个“尾值”(一般可以用Set.prototype.size
),并返回。具体代码就不写了,可以自己试试。