You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JavaScript中按员工姓名排序嵌套结构的员工数据?

按员工姓名排序JavaScript对象键值对问题

问题概述

现有一个JavaScript对象,键为员工ID(数字类型),值为对应员工的任务信息数组。需求是按员工姓名的字母顺序重新排列对象的键值对顺序,保持原有数据结构,但现有代码无法实现预期效果。

原始数据结构:

data={
1200: [
       {
            employeeName: 'Harish',
            task: 'task1',
            employeeId: '1200'
        },
        {
            employeeName: 'Harish',
            task: 'task2',
            employeeId: '1200'
        },
        {
            employeeName: 'Harish',
            task: 'task3',
            employeeId: '1200'
        }
 ],
1205: [
       {
            employeeName: 'Akshay',
            task: 'task1',
            employeeId: '1205'
        },
        {
            employeeName: 'Akshay',
            task: 'task2',
            employeeId: '1205'
        },
],
1210: [
       {
            employeeName: 'Abhay',
            task: 'task1',
            employeeId: '1210'
        },
        {
            employeeName: 'Abhay',
            task: 'task2',
            employeeId: '1210'
        },
]
}

预期输出(按姓名A-Z排序):

data={
1210: [
       {
            employeeName: 'Abhay',
            task: 'task1',
            employeeId: '1210'
        },
        {
            employeeName: 'Abhay',
            task: 'task2',
            employeeId: '1210'
        },
],
1205: [
       {
            employeeName: 'Akshay',
            task: 'task1',
            employeeId: '1205'
        },
        {
            employeeName: 'Akshay',
            task: 'task2',
            employeeId: '1205'
        },
],
1200: [
       {
            employeeName: 'Harish',
            task: 'task1',
            employeeId: '1200'
        },
        {
            employeeName: 'Harish',
            task: 'task2',
            employeeId: '1200'
        },
        {
            employeeName: 'Harish',
            task: 'task3',
            employeeId: '1200'
        }
 ]
 }

尝试的代码

以下代码执行后输出仍与原始数据顺序一致:

function sort() {
const data = {
1200: [
  {
    employeeName: 'Harish',
    task: 'task1',
    employeeId: '1200'
  },
  {
    employeeName: 'Harish',
    task: 'task2',
    employeeId: '1200'
  },
  {
    employeeName: 'Harish',
    task: 'task3',
    employeeId: '1200'
  },
],
1205: [
  {
    employeeName: 'Akshay',
    task: 'task1',
    employeeId: '1205'
  },
  {
    employeeName: 'Akshay',
    task: 'task2',
    employeeId: '1205'
  },
],
1210: [
  {
    employeeName: 'Abhay',
    task: 'task1',
    employeeId: '1210'
  },
  {
    employeeName: 'Abhay',
    task: 'task2',
    employeeId: '1210'
  },
 ],
};
  const sortedObj = {};
  Object.keys(data)
    .sort((a, b) => {
      const nameA = data[a][0].employeeName.toUpperCase();
      const nameB = data[b][0].employeeName.toUpperCase();
      if (nameA < nameB) return -1;
      if (nameA > nameB) return 1;
      return 0;
    })
    .forEach((key) => {
      sortedObj[key] = [...data[key]];
    });
  return sortedObj;
}
console.log(sort());

问题原因

JavaScript中,数字类型的对象键会被自动按升序排序。你的代码虽然对键数组做了姓名排序,但构建新对象时,JS会自动将数字键重新排列为升序,导致手动排序的结果被覆盖。

解决方法

方案1:将对象键改为字符串类型

把数字键改为带引号的字符串,JS就不会自动排序这类键,会保留手动插入的顺序:

function sortEmployees() {
  const data = {
    '1200': [
      {
        employeeName: 'Harish',
        task: 'task1',
        employeeId: '1200'
      },
      {
        employeeName: 'Harish',
        task: 'task2',
        employeeId: '1200'
      },
      {
        employeeName: 'Harish',
        task: 'task3',
        employeeId: '1200'
      },
    ],
    '1205': [
      {
        employeeName: 'Akshay',
        task: 'task1',
        employeeId: '1205'
      },
      {
        employeeName: 'Akshay',
        task: 'task2',
        employeeId: '1205'
      },
    ],
    '1210': [
      {
        employeeName: 'Abhay',
        task: 'task1',
        employeeId: '1210'
      },
      {
        employeeName: 'Abhay',
        task: 'task2',
        employeeId: '1210'
      },
    ],
  };

  const sortedObj = {};
  Object.keys(data)
    .sort((a, b) => {
      const nameA = data[a][0].employeeName.toUpperCase();
      const nameB = data[b][0].employeeName.toUpperCase();
      return nameA.localeCompare(nameB);
    })
    .forEach((key) => {
      sortedObj[key] = [...data[key]];
    });

  return sortedObj;
}

console.log(sortEmployees());

方案2:使用Map存储(严格保持插入顺序)

Map会严格保留键的插入顺序,适合需要精准控制顺序的场景:

function sortEmployeesWithMap() {
  const data = {
    1200: [
      { employeeName: 'Harish', task: 'task1', employeeId: '1200' },
      { employeeName: 'Harish', task: 'task2', employeeId: '1200' },
      { employeeName: 'Harish', task: 'task3', employeeId: '1200' },
    ],
    1205: [
      { employeeName: 'Akshay', task: 'task1', employeeId: '1205' },
      { employeeName: 'Akshay', task: 'task2', employeeId: '1205' },
    ],
    1210: [
      { employeeName: 'Abhay', task: 'task1', employeeId: '1210' },
      { employeeName: 'Abhay', task: 'task2', employeeId: '1210' },
    ],
  };

  const sortedMap = new Map(
    Object.entries(data).sort(([, tasksA], [, tasksB]) => {
      const nameA = tasksA[0].employeeName.toUpperCase();
      const nameB = tasksB[0].employeeName.toUpperCase();
      return nameA.localeCompare(nameB);
    })
  );

  return sortedMap;
}

console.log(sortEmployeesWithMap());

最终输出

方案1的输出结果:

{
  '1210': [
    { employeeName: 'Abhay', task: 'task1', employeeId: '1210' },
    { employeeName: 'Abhay', task: 'task2', employeeId: '1210' }
  ],
  '1205': [
    { employeeName: 'Akshay', task: 'task1', employeeId: '1205' },
    { employeeName: 'Akshay', task: 'task2', employeeId: '1205' }
  ],
  '1200': [
    { employeeName: 'Harish', task: 'task1', employeeId: '1200' },
    { employeeName: 'Harish', task: 'task2', employeeId: '1200' },
    { employeeName: 'Harish', task: 'task3', employeeId: '1200' }
  ]
}

内容的提问来源于stack exchange,提问作者user17320926

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 16:17:55