【问题标题】:sort array in javascript base on the external id基于外部ID在javascript中排序数组
【发布时间】:2020-04-14 02:08:59
【问题描述】:

我有一组用户,每个用户都有一个唯一的 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"
  }
]

【问题讨论】:

  • lists.sort(function(u1,u2) { return u1.id == currentUser ? -1: 0; })
  • 你的意思是先要 Tina,然后再按 id asc 排序其余的?

标签: javascript arrays ecmascript-6 javascript-objects


【解决方案1】:

你应该使用 Array.sort() 方法。它接受将用于对项目进行排序的函数。值得一提的是,它会对数组进行原地排序(调用它后 list 将保持排序,它不会复制它):

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))

【讨论】:

    【解决方案2】:

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

    [
      ...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)),
    ]);

    【讨论】:

      【解决方案3】:

      您希望 currentuser 元素位于首位。所以一种方法是使用数组的自定义排序。请参阅 here sort 函数的工作原理。

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

      【讨论】:

      • 您的解决方案未对剩余数组进行排序 :(.
      • 我的错.. 我以为他只想要他的用户在 0 索引。
      • @Scalway 感谢您在我的代码中发现错误。更新了我的答案
      猜你喜欢
      • 1970-01-01
      • 2015-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-17
      • 1970-01-01
      • 2017-09-12
      • 1970-01-01
      相关资源
      最近更新 更多