对数组进行排序,使零值位于每个组的底部,其余值按字母顺序排序

Sort the array so that zero values are at the bottom of each group and the remaining values are sorted alphabetically

需要对数组进行排序,使具有相同 currentUser 的值在最前面,并且这些值按名称排序,如果没有名称,则需要将它们按组向下排序。

const currentUser = 256;
const settings = [
  {
    name: null,
    userId: 256,
  },
  {
    name: 'Bear',
    userId: 256,
  },
  {
    name: 'Anatomy',
    userId: 256,
  },
  {
    name: null,
    userId: 12,
  },
  {
    name: null,
    userId: 23,
  },
  {
    name: 'Anatomy',
    userId: 43,
  },
];

settings.sort((a, b) => {
  const aName = a.name || null;
  const bName = b.name || null;

  return (
    (aName === null) - (bName === null) ||
    Number(b.userId === currentUser) - Number(a.userId === currentUser) ||
    aName - bName
  );
});

console.log(settings);

结果应该是一个数组:

[
  {
    name: 'Anatomy',
    userId: 256,
  },
  {
    name: 'Bear',
    userId: 256,
  },
  {
    name: null,
    userId: 256,
  },
  {
    name: 'Anatomy',
    userId: 43,
  },
  {
    name: null,
    userId: 12,
  },
  {
    name: null,
    userId: 23,
  },
]

如果有任何帮助,我将不胜感激,祝你有愉快的一天。

代码中的顺序如下:

  • 最优先考虑 userId 的匹配 currentUser,如果有两个 userId 匹配 currentUser,则按 name 的字母顺序对它们进行排序对于 null 个名字,将它们放在最后( 在该组 中)。
  • userId 降序排列其他项目。
  • 对于具有相同 userId 的项目,再次按 name 的字母顺序对它们进行排序,对于 null 名称,将它们放在最后( 在该组中).

const currentUser = 43;
const settings = [
  { name: null, userId: 256 },
  { name: null, userId: 43 },
  { name: "Abby", userId: 43 },
  { name: "Bear", userId: 256 },
  { name: "John", userId: 256 },
  { name: "Simon", userId: 43 },
  { name: null, userId: 12 },
  { name: null, userId: 23 },
  { name: "Anatomy", userId: 43 },
];

function sortByName(a, b) {
  if (Object.is(a, null) && Object.is(b, null)) {
    return 0;
  } else if (Object.is(a, null)) {
    return 1;
  } else if (Object.is(b, null)) {
    return -1;
  } else {
    return a.localeCompare(b);
  }
}

settings.sort((a, b) => {
  // Objects that have same `userId` as `currentUser`
  if (a.userId === currentUser && b.userId === currentUser) {
    return sortByName(a.name, b.name);
  } else if (a.userId === currentUser) {
    return -1;
  } else if (b.userId === currentUser) {
    return 1;
  }

  // Other objects
  if (a.userId > b.userId) {
    return -1;
  } else if (a.userId < b.userId) {
    return 1;
  } else {
    return sortByName(a.name, b.name);
  }
});

console.log(settings);