繁体   English   中英

排序对象数组以首先放置与 id 匹配的特定 object

[英]sort array of objects to place a particular object first that matches an id

我有一个包含用户数据的对象数组。

我需要做的是先用登录用户订购它们。

我以前有这个工作:

  const loggedInUserTemplate = users?.find(loggedInUser => {
    return loggedInUser.id === user?.id;
  });

  renderUsers?.forEach((item, i) => {
    if (item.id === loggedInUserTemplate.id) {
      renderUsers?.splice(i, 1);
      renderUsers?.unshift(item);
    }
  });

但由于各种原因,我不能再使用它了。

我的新解决方案包括这些但没有工作。 有没有人有什么建议?

const loggedInUser = user?.id;

  let test = JSON.parse(JSON.stringify(users));
  // test = test.sort((a, user) => (a.id === loggedInUser ? 0 : 1));
  // test = test.sort((a, user) => (a.id == loggedInUser ? 0 : 1));

  test.sort((a, loggedInUser) => {
    console.log("what is a?", typeof a.id, a.id);
    console.log("user -----", typeof loggedInUser, loggedInUser);
    if (a?.id === loggedInUser) return 0;
  });

  console.log("test", test);

数组如下所示:

[
{__typename: "user", id: "4274", firstName: "tom"},
{__typename: "user", id: "742", firstName: "richard"},
{__typename: "user", id: "4293", firstName: "harry" }
]

在我的测试用例中,登录用户 id 是“742”,所以我希望“richard”首先出现在数组中。

使用 JavaScript 内置sort方法是 go 的方式,我同意。

假设您有一个登录用户 ID 数组,在您的示例中设置为let loggedInUsers = ["742"] 然后像这样对它们进行排序应该可以工作:

test.sort((a, b) => {
    // push b to the top if he is logged in
    if(loggedInUsers.includes(b.id)) return 1;
    // otherwise stick to the original order
    else return 0;
})

这意味着如果第一个用户(a 和 b)登录,它将被推到顶部。 如果 a未登录,您可以通过仅将 b 向上推来更改 if 语句以保持登录用户的原始顺序:

if(loggedInUsers.includes(b.id) && !loggedInUsers.includes(a.id)) return 1;

所以解决方案是在 state 中创建一个新数组并像这样使用.sort()

setUserArray([...users].sort(a => (a.id === user.id? -1: 1)));

*注意 -1 因为 chrome 将 0 读取为 falsy,所以它不会那样工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM