
本文介绍在 laravel + ajax 场景下,如何将多个带随机键名的对象(如购物车 session 数据)合并为一个扁平化对象,仅保留原始键值对,去除中间层级结构。核心方法是使用 javascript 的 object.values() 与 object.assign() 组合实现高效合并。
在 Laravel 应用中,购物车数据常以关联数组形式存储于 Session,例如 session()->get('cart.products') 返回的是一个包含多个子对象(如 data1、data2)的结构,每个子对象又以商品 ID 为键、商品信息为值。但前端 Ajax 接收后,往往需要将其“摊平”为单一对象,以便统一遍历或提交——即把所有内层键值对(如 1234543: {...})直接提升至顶层,而非嵌套在 data1 或 data2 下。
此时,不推荐在 Laravel 后端做复杂数组合并(尤其当结构动态、键名不可预知时),而应优先利用现代 JavaScript 的原生能力高效处理。关键在于理解:Object.values(obj) 会提取对象所有可枚举属性值,形成数组;而 Object.assign(target, ...sources) 支持展开多个源对象进行浅合并。
✅ 正确做法(前端 JS 实现):
// 假设 Ajax 成功回调中收到响应 data
axios.get('/api/cart').then(response => {
const { data } = response;
// 将 data1、data2 等所有子对象的键值对合并为单个对象
const flattened = Object.assign({}, ...Object.values(data));
console.log(flattened);
// 输出示例:
// {
// "1234543": { id: 1, title: "Product Title1", ... },
// "3453234": { id: 2, title: "Product Title2", ... },
// ...
// }
});⚠️ 注意事项:
- Object.assign(...Object.values(obj)) 要求 obj 的每个属性值本身都是对象;若存在非对象值(如 null、string),会导致运行时错误,建议增加类型校验:
const validValues = Object.values(data).filter(val => val && typeof val === 'object'); const flattened = Object.assign({}, ...validValues); - 若需转换为纯数组(而非对象),可进一步调用 Object.values(flattened);
- Laravel 端无需修改返回逻辑,保持原样 return response($get_session); 即可,确保响应为 JSON 格式(Laravel 默认已处理);
- 该方案兼容性良好(支持 ES2015+),如需兼容 IE,可使用 Babel 编译或改用 reduce 替代:
const flattened = Object.values(data).reduce((acc, obj) => ({ ...acc, ...obj }), {});
总结:面对动态键名、多层嵌套的会话数据,前端扁平化是最轻量、最灵活的解决方案。掌握 Object.values() 与 Object.assign() 的组合用法,能显著提升数据处理效率,避免后端过度耦合与冗余逻辑。









