对象数组按某个属性的某个顺序连续排序
问题描述
按照数据中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: '羽毛球'
},
]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
从题主给的结果数据来看,并不是单纯的按
love
来排序,而是「先按name
再按love
的双重排序」,而且name
不是按字母序,而是按先后出现的顺序love
是按“乒乓球、羽毛球、篮球”的顺序其中,按
name
出现序需要提前遍历数组,把顺序排出来;或者在排的过程中来产生(因为是顺序,可以在过程中来产生)。下面这个例子是提前产生的
其中,生成
nameSerials
过程(IIFE 中)中的names
可以简单地用一句话产生虽然(可能仅在某些环境下)效果还是如预期,但是
Set
本身不应保证排序,所以不同的 JS Runtime 实现有可能不同,所以不这样用。另一种方法,在过程中产生
nameSerials
,其实就是在取序数的时候,检查如果这个name
不存在于集合中,就把它保存进去,映射到一个“尾值”(一般可以用Set.prototype.size
),并返回。具体代码就不写了,可以自己试试。你的题目描述似乎存在问题,
如果按 「按照数据中love这个属性去排序,而且这个顺序必须是“乒乓球、羽毛球、篮球”排序」 实现的话
在线代码演示
但按你后面提供的第二份数据你的目的似乎是 「先将数据按 name 排序,然后再按数据中love这个属性去排序,而且这个顺序必须是“乒乓球、羽毛球、篮球”排序」
实现方案如下
在线代码演示
不过这里的排序是 李 吴 张 ,不清楚你第二份数据中的张排第二位是按照什么规则来的,需要你按照自己的规则稍微修改一下