快速导航×

J*aScript:如何在不改变原数组的情况下,将数组中的元素移动到另一个数组2025-11-16 11:21:40

javascript:如何在不改变原数组的情况下,将数组中的元素移动到另一个数组

本文将介绍如何在 J*aScript 中,针对一个包含日期和时间信息的对象,将特定元素从数组中取出并移动到另一个数组,同时避免修改原始数据。我们将通过 Object.values()、flat() 和 reduce() 方法来实现这一目标,确保数据的完整性和可维护性。

解决方案:使用 Object.values()、flat() 和 reduce()

核心思路是将对象的所有值(即数组)提取出来,然后将这些数组扁平化为一个单一的数组。最后,使用 reduce() 方法,根据每个对象的 day 属性,将它们重新组合成一个新的对象。这样,原始对象就不会被修改。

代码实现

假设我们有以下数据结构:

Waifulabs Waifulabs

一键生成动漫二次元头像和插图

Waifulabs 317 查看详情 Waifulabs
const days = {
  "monday": [{
      "day": "monday",
      "type": "open",
      "value": 43200
    },
    {
      "day": "monday",
      "type": "close",
      "value": 75600
    }
  ],
  "tuesday": [{
      "day": "tuesday",
      "type": "open",
      "value": 43200
    },
    {
      "day": "tuesday",
      "type": "close",
      "value": 75600
    }
  ],
  "wednesday": [{
      "day": "wednesday",
      "type": "open",
      "value": 43200
    },
    {
      "day": "wednesday",
      "type": "close",
      "value": 75600
    }
  ],
  "thursday": [{
      "day": "thursday",
      "type": "open",
      "value": 43200
    },
    {
      "day": "thursday",
      "type": "close",
      "value": 75600
    }
  ],
  "friday": [{
    "day": "friday",
    "type": "open",
    "value": 36000
  }],
  "saturday": [{
      "day": "friday",
      "type": "close",
      "value": 3600
    },
    {
      "day": "saturday",
      "type": "open",
      "value": 36000
    }
  ],
  "sunday": [{
      "day": "saturday",
      "type": "close",
      "value": 3600
    },
    {
      "day": "sunday",
      "type": "open",
      "value": 43200
    },
    {
      "day": "sunday",
      "type": "close",
      "value": 75600
    }
  ]
}

const result = Object.values(days).flat().reduce((acc, o) => {
    (acc[o.day] ??= []).push(o);
    return acc;
}, {});

console.log(result);

代码详解

  1. Object.values(days): 这个方法提取 days 对象的所有值,返回一个包含所有数组的数组。
  2. .flat(): 这个方法将上一步返回的数组扁平化为一个单一的数组,其中包含了所有的时间对象。
  3. .reduce((acc, o) => { ... }, {}): reduce() 方法用于遍历扁平化后的数组,并构建一个新的对象。
    • acc: 累加器,用于存储最终结果。初始值是一个空对象 {}。
    • o: 当前正在处理的数组元素(即一个时间对象)。
    • (acc[o.day] ??= []).push(o): 这行代码是核心逻辑。它首先检查累加器 acc 中是否已经存在以当前时间对象的 day 属性为键的数组。如果不存在,则使用空数组 [] 初始化该键的值。然后,将当前时间对象 o 推入到对应的数组中。 ??= 是空值合并赋值运算符,相当于 acc[o.day] = acc[o.day] || []。
    • return acc: 返回更新后的累加器,用于下一次迭代。

优点

  • 不可变性 (Immutability): 此方法不会修改原始的 days 对象,而是创建一个新的对象 result。
  • 简洁性: 代码简洁易懂,使用了现代 J*aScript 的特性。
  • 灵活性: 可以轻松地适应不同的数据结构,只要对象中包含 day 属性即可。

注意事项

  • 此方法依赖于 Object.values()、flat() 和空值合并赋值运算符 ??=,这些都是 ES2019 及更高版本引入的特性。如果需要在旧版本的 J*aScript 环境中使用,可能需要使用 polyfill 或替代方案。
  • 确保对象中的每个元素都包含 day 属性,否则可能会导致意料之外的结果。

总结

通过使用 Object.values()、flat() 和 reduce() 方法,我们可以高效且安全地将数组中的元素移动到另一个数组,同时保持数据的不可变性。这种方法在处理复杂数据结构时非常有用,可以提高代码的可维护性和可读性。

立即学习“J*a免费学习笔记(深入)”;

以上就是J*aScript:如何在不改变原数组的情况下,将数组中的元素移动到另一个数组的详细内容,更多请关注其它相关文章!


# java  # red  # 数据结构  # 累加器  # 组中  # 运算符  # 如何在  # 不改变  # javascript  # 平谷网站建设建站  # 汕尾如何优化网站营销  # 舟山建筑网站建设  # 揭阳seo优化批发  # 杭州seo优化排名公司  # 珠宝营销推广的思路  # 浙江营销推广拍摄平台  # 保定制造行业网站建设  # 德州网站运营推广  # 浏阳学校网站建设方案  # 如何使用  # 管理器  # 自定义  # 情况下 


相关栏目: 【 企业资讯168 】 【 行业动态20933 】 【 网络营销52431 】 【 网络学院91036 】 【 运营推广7012 】 【 科技资讯60970


相关推荐: 将HTML Canvas内容转换为可上传的图像文件(File对象)  Win10磁盘清理工具在哪 Win10打开并使用磁盘清理【教程】  React Hooks最佳实践:动态组件状态管理的组件化方案  CSS Box Model与弹性按钮:维持布局稳定的动画实践  如何使用 Excel 发布器与 Power BI 分享 Excel 洞察  J*aScript生成器_j*ascript异步迭代  mysql备份恢复性能优化_mysql备份恢复性能优化方法  荒野行动PC版怎么注册_荒野行动PC版账号注册详细流程图文教程  汽水音乐车机版8.9下载 汽水音乐车机版8.9版本安装入口  HTML长属性值处理:表单action路径优化与代码规范应对  c++中为什么推荐使用using替代typedef_c++现代化类型别名  UC浏览器如何安装插件 UC浏览器添加扩展程序详细教程【进阶】  解决深度学习模型训练初期异常高损失与完美验证准确率问题  css如何实现简易弹出层_使用position和z-index实现遮罩弹层  J*aScript中如何高效提取对象指定属性  马斯克:Optimus 人形机器人复数形式为 Optimi  CSS自定义字体样式被系统字体替换怎么办_font-face方式指定font-display控制渲染策略  Angular响应式表单:实现提交后表单及按钮的禁用与只读化  J*a里如何使用N*igableMap进行导航操作_可导航Map操作技巧解析  在J*a中如何使用Stream.map转换元素_Stream映射操作解析  c++如何使用折叠表达式(Fold Expressions)_c++17可变参数模板新技巧  win11专注助手在哪 Win11免打扰模式设置与自动化规则【指南】  Win10如何清理注册表垃圾 Win10注册表维护与优化指南【慎用】  聚水潭ERP登录页面入口 聚水潭ERP官网登录界面  vivo浏览器怎么扫描二维码 vivo浏览器内置扫一扫功能使用方法  EMS快递官网app_中国邮政速递物流手机客户端  在Pyomo中实现基于变量的条件约束:Big-M方法详解  MAC如何安全彻底地删除文件_MAC使用终端命令确保文件无法被恢复  《刺客信条4:黑旗》重制版新细节曝光:无缝加载 地图更细致!  荣耀Play7TPro怎样在信息App置顶客服对话_iPhone荣耀Play7TPro信息App置顶客服对话【优先查看】  12306选座怎么选到商务座_12306商务座选择与配置说明  CSS布局中意外空白:解决padding-top导致的顶部间距问题  Go RPC HTTP服务正确实现与常见陷阱解析  j*a toString()的覆盖  顺丰快件物流信息 官方网站查询入口  包子漫画官方网站阅读入口-包子漫画在线漫画官网直达链接  如何创建独立于主系统的J*a运行环境_隔离式环境搭建策略  Golang如何测试channel通信行为_Golang channel通信测试与分析方法  漫蛙2在线漫画入口 漫蛙正版漫画网页版直达  如何使用J*aScript精确选择并批量修改特定父元素下子链接的样式  Python中高效且防溢出的双曲正弦计算:基于对数空间的优化策略  抓大鹅解压小游戏 抓大鹅摸鱼解压入口  Lar*el的路由模型绑定怎么用_Lar*el Route Model Binding简化控制器逻辑  Android Studio计算器C键功能异常排查与修复教程  ArrayList与LinkedList操作复杂度详解:遍历与修改  163邮箱登录密码 163邮箱忘记密码找回  Log4j Console Appender性能瓶颈与高并发优化策略  J*aScript实现单选按钮与关联输入框的联动禁用教程  Word2013如何插入视频和音频媒体_Word2013媒体插入的多媒体支持  J*a递归快速排序中静态变量的状态管理与陷阱