基于外部ID在JavaScript中对数组进行排序

3
我有一个用户数组,每个用户都有一个唯一的id。我想通过与我的currentUser进行比较来对这个数组进行排序,以便我可以将我的当前用户放在数组的第一位,其余所有用户按照字母顺序排列在之后。 我用JavaScript如何实现这个功能? 谢谢。
const currentuser = "f8a0b09c-ea3e-4f33-9c01-c16200f6ce1b";

const lists = [
  {
    "name": "Mahdieh Hosseiny",
    "avatar": "/static/media/defaultAvatar.95bdd942.svg",
    "id": "eb6433d3-11e8-4660-82fa-3f53cca569f4"
  },
  {
    "name": "Ahmad Dehnavi",
    "avatar": "/static/media/defaultAvatar.95bdd942.svg",
    "id": "dc21291c-34bc-4363-b733-cbc405ba2eab"
  },
  {
    "name": "Staff 4 Worrell",
    "avatar": "/static/media/defaultAvatar.95bdd942.svg",
    "id": "a3738c05-d6fb-4fb2-90ef-98d0b71939c5"
  },
  {
    "name": "Amir Hossein",
    "avatar": "/static/media/defaultAvatar.95bdd942.svg",
    "id": "c1a70e04-992e-4509-8271-29efe3f6813b"
  },
  {
    "name": "Hormoz Javadi",
    "avatar": "/static/media/defaultAvatar.95bdd942.svg",
    "id": "c9dbbb02-7179-4137-87df-f080cd5b7400"
  },
  {
    "name": "westscityclub verify",
    "avatar": "/static/media/defaultAvatar.95bdd942.svg",
    "id": "25b93407-7b0d-4639-a758-0c7e40a88dc4"
  },
  {
    "name": "Tina  Worrell",
    "avatar": "savatar.jpg",
    "id": "f8a0b09c-ea3e-4f33-9c01-c16200f6ce1b"
  }
]

1
lists.sort(function(u1,u2) { return u1.id == currentUser ? -1: 0; }) - jagad89
你的意思是先按Tina,然后按id升序排列其余的吗? - grodzi
3个回答

2

这将输出结果数组,其中相应的对象将是第一个,其他对象将按 name 属性排序:

[
  ...lists.filter((item) => item.id === currentuser),
  ...lists.filter((item) => item.id !== currentuser).sort((a, b) => a.name.localeCompare(b.name)),
]

const currentuser = "f8a0b09c-ea3e-4f33-9c01-c16200f6ce1b";

const lists = [
  {
    "name": "Mahdieh Hosseiny",
    "avatar": "/static/media/defaultAvatar.95bdd942.svg",
    "id": "eb6433d3-11e8-4660-82fa-3f53cca569f4"
  },
  {
    "name": "Ahmad Dehnavi",
    "avatar": "/static/media/defaultAvatar.95bdd942.svg",
    "id": "dc21291c-34bc-4363-b733-cbc405ba2eab"
  },
  {
    "name": "Staff 4 Worrell",
    "avatar": "/static/media/defaultAvatar.95bdd942.svg",
    "id": "a3738c05-d6fb-4fb2-90ef-98d0b71939c5"
  },
  {
    "name": "Amir Hossein",
    "avatar": "/static/media/defaultAvatar.95bdd942.svg",
    "id": "c1a70e04-992e-4509-8271-29efe3f6813b"
  },
  {
    "name": "Hormoz Javadi",
    "avatar": "/static/media/defaultAvatar.95bdd942.svg",
    "id": "c9dbbb02-7179-4137-87df-f080cd5b7400"
  },
  {
    "name": "westscityclub verify",
    "avatar": "/static/media/defaultAvatar.95bdd942.svg",
    "id": "25b93407-7b0d-4639-a758-0c7e40a88dc4"
  },
  {
    "name": "Tina  Worrell",
    "avatar": "savatar.jpg",
    "id": "f8a0b09c-ea3e-4f33-9c01-c16200f6ce1b"
  }
];

console.log([
 ...lists.filter((item) => item.id === currentuser),
  ...lists.filter((item) => item.id !== currentuser).sort((a, b) => a.name.localeCompare(b.name)),
]);


1
你应该使用Array.sort()方法。它接受一个函数来对项目进行排序。值得一提的是,它会就地对数组进行排序(调用后,列表将保持排序状态,不会复制它)。

const currentuser = "f8a0b09c-ea3e-4f33-9c01-c16200f6ce1b";

const lists = [
  {
    "name": "Mahdieh Hosseiny",
    "avatar": "/static/media/defaultAvatar.95bdd942.svg",
    "id": "eb6433d3-11e8-4660-82fa-3f53cca569f4"
  },
  {
    "name": "Ahmad Dehnavi",
    "avatar": "/static/media/defaultAvatar.95bdd942.svg",
    "id": "dc21291c-34bc-4363-b733-cbc405ba2eab"
  },
  {
    "name": "Staff 4 Worrell",
    "avatar": "/static/media/defaultAvatar.95bdd942.svg",
    "id": "a3738c05-d6fb-4fb2-90ef-98d0b71939c5"
  },
  {
    "name": "Tina  Worrell",
    "avatar": "savatar.jpg",
    "id": "f8a0b09c-ea3e-4f33-9c01-c16200f6ce1b"
  },
  {
    "name": "Amir Hossein",
    "avatar": "/static/media/defaultAvatar.95bdd942.svg",
    "id": "c1a70e04-992e-4509-8271-29efe3f6813b"
  },
  {
    "name": "Hormoz Javadi",
    "avatar": "/static/media/defaultAvatar.95bdd942.svg",
    "id": "c9dbbb02-7179-4137-87df-f080cd5b7400"
  },
  {
    "name": "westscityclub verify",
    "avatar": "/static/media/defaultAvatar.95bdd942.svg",
    "id": "25b93407-7b0d-4639-a758-0c7e40a88dc4"
  }
]


function compare(a, b) {
   if (a.id == currentuser) return -1
   if (b.id == currentuser) return 1
   return a.name.localeCompare(b.name)
}

lists.sort(compare) //from now lists is sorted.

console.dir(lists.map(s => s.name))


1

您希望将currentuser元素放在第一位置。其中一种方法是使用自定义排序数组。请参见此处,了解sort函数的工作原理。

lists.sort(function(u1,u2) { return u1.id == currentuser ? -1: u1.id.localCompare(u2.id); });




你的解决方案没有对剩余数组进行排序 :(。 - Scalway
我的错..我以为他只想要他的用户在0索引。 - jagad89
@Scalway 感谢你发现了我代码中的错误。我已经更新了答案。 - jagad89

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接