信息发布→ 登录 注册 退出

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

发布时间:2025-11-16

点击量:

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:如何在不改变原数组的情况下,将数组中的元素移动到另一个数组的详细内容,更多请关注其它相关文章!


相关文章: Win11 BitLocker密码忘了怎么办 Win11找回BitLocker恢复密钥方法【解决】  小米Civi 4录制视频过暗_小米Civi 4亮度优化  顺丰快递查单号物流信息 顺丰快递小程序查询入口  理解Python模块与全局变量的作用域管理  实现分段式页面滚动导航:CSS与J*aScript教程  怎么在html里运行vbs脚本_html中运行vbs脚本方法【教程】  蛙漫2台版漫画地址 Manwa2正版网页版链接  蛙漫画网页版全站入口 蛙漫热门作品免费浏览  58动漫网在线官方网 58动漫网正版动漫入口网址  taptap防沉迷怎么解除 taptap解除健康系统限制说明【2025最新】  Golang如何使用net/url解析URL_Golang URL解析与处理方法  C#中解析不规范的HTML为XML 常见的坑与解决办法  深入理解rpy2中的类型转换:优化Python对象到R矩阵的映射  PySpark中从现有列右侧提取可变长度字符创建新列的教程  俄罗斯Yandex免登录入口_Yandex搜索引擎官网一键直达  mcjs网页版流畅运行 mcjs低配电脑畅玩入口  中兴BladeV30怎样用测距估书架层高_iPhone中兴BladeV30测距估书架层高【家装参考】  Eclipse怎么运行工程_Eclipse工程运行配置说明  在WordPress中通过REST API访问受BasicAuth保护的站点内容  Lar*el DB::listen 事件中的查询执行时间单位解析  如何让 composer 信任自签名的 HTTPS 证书源?  PHP教程:高效从URL路径中提取倒数第二个片段  谷歌google账号注册详细步骤 谷歌账号注册官方教程  快手极速版在线观看 官方网页版登录地址  神经网络二分类模型训练异常:高损失与完美验证准确率的排查与修正  qq浏览器如何查看和导出已保存的密码 qq浏览器密码管理器数据备份教程  将PCM16音频转换为W*并编码为Base64:浏览器环境下的手动处理指南  Yandex官方入口网址 Yandex俄罗斯搜索引擎最新在线地址  Excel Power Pivot如何处理XML数据源 构建高级数据模型  解决PHP集成HTML后CSS和图片路径加载问题的指南  Angular Material 垂直步进器:实现底部到顶部排序的教程  UC浏览器官网入口2025最新 UC浏览器网页版正式地址  内存检查:在VS Code中调试C++时的内存视图  Golang如何使用bytes.Split分割字节切片_Golang bytes切片分割方法  vivo云服务网页版登录 怎么登录vivo云服务网页版  深入理解J*aScript中的B样条曲线与节点向量生成  期待已久:小米17 Ultra、小米首款NAS本月登场  三星GalaxyZFold5怎样在相册制作折叠屏分镜_iPhone三星GalaxyZFold5相册制作折叠屏分镜【创意编辑】  J*aScript中向JSON对象添加新属性的正确姿势  在J*a中如何开发在线活动报名与管理系统_活动报名管理项目实战解析  中兴Axon42Ultra怎样在文件App筛图_iPhone中兴Axon42Ultra文件App筛图【图片筛选】  Mudbox图层蒙版怎么用_Mudbox图层蒙版数字雕刻应用技巧  黑鲨3Pro怎样在相册开漫画风滤镜_iPhone黑鲨3Pro相册开漫画风滤镜【趣味滤镜】  Python async/await 协程:CPU密集型任务的陷阱与解决方案  微信商城在哪里打开【步骤】  Golang如何优雅处理error_Golang error处理最佳实践总结  Python实现多节点属性重叠度分析教程  德邦快递查询平台 德邦快递物流信息查询入口  我的世界官方游戏入口 我的世界官网平台直达链接  浏览器打开即用 美图秀秀网页版入口 

在线客服
服务热线

服务热线

4008988990

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!