【问题标题】:sort array of objects to place a particular object first that matches an id对对象数组进行排序以首先放置与 id 匹配的特定对象
【发布时间】:2021-07-21 15:16:32
【问题描述】:

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

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

我以前曾与此合作过:

  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 arrays reactjs sorting


    【解决方案1】:

    使用 JavaScript 内置的 sort 方法是可行的方法,我同意。

    假设您有一个登录用户 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)登录,它将被推到顶部。您可以更改 if 语句以保持登录用户的原始顺序,仅在 a 登录时将 b 向上推:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-11
        • 2021-12-28
        • 1970-01-01
        • 2021-10-21
        相关资源
        最近更新 更多