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

嵌套对象数组按属性过滤失效问题排查

问题:按分类ID过滤嵌套结构的订单数组失败

我有一个包含lineItems数组的订单数组,lineItems里又嵌套了categories数组。想根据订单项的分类ID过滤订单数组,但遇到了问题。之前按商品ID过滤的逻辑能正常运行,但第三层嵌套的过滤出了问题,希望尽量少用for循环。

订单数组结构

[{"href": "https://sandbox.dev.clover.com/v3/merchants/6RD8H04A896K1/orders/937K8W59RPEHW","id": "937K8W59RPEHW","currency": "USD","employee": {"id": "VH7JB40JRGCAG"},"total": 1165,"paymentState": "OPEN","title": "general@dss.com safs","orderType": {"id": "YT62H0SSGJF0M"},"taxRemoved": false,"isVat": false,"state": "open","manualTransaction": false,"groupLineItems": false,"testMode": false,"createdTime": 1702095585000,"clientCreatedTime": 1702095585000,"modifiedTime": 1702095597000,"lineItems": [{"id": "F7W4DXKZNA4NP","orderRef": {"id": "937K8W59RPEHW"},"item": {"id": "A5JPMS665CQW6"},"name": "Chicken Supreme Bowl /G,O With Bread","alternateName": "","price": 1099,"itemCode": "","note": "","printed": false,"createdTime": 1702095585000,"orderClientCreatedTime": 1702095585000,"exchanged": false,"refunded": false,"isRevenue": true,"categories": [{"id": "55DYZ8T2ZVB88","name": "Bowl","sortOrder": 20,"deleted": false}]}]},{"href": "https://sandbox.dev.clover.com/v3/merchants/6RD8H04A896K1/orders/3T3YN416MASV2","id": "3T3YN416MASV2","currency": "USD","employee": {"id": "VH7JB40JRGCAG"},"total": 4025,"paymentState": "OPEN","title": "general@dss.com gsrw","orderType": {"id": "YT62H0SSGJF0M"},"taxRemoved": false,"isVat": false,"state": "open","manualTransaction": false,"groupLineItems": false,"testMode": false,"createdTime": 1702095600000,"clientCreatedTime": 1702095600000,"modifiedTime": 1702095611000,"lineItems": [{"id": "AJWXHE6JE2W4T","orderRef": {"id": "3T3YN416MASV2"},"item": {"id": "VNRDHNRBG5AVM"},"name": "Baklava 1 Tray","alternateName": "","price": 1499,"itemCode": "","note": "","printed": false,"createdTime": 1702095600000,"orderClientCreatedTime": 1702095600000,"exchanged": false,"refunded": false,"isRevenue": true,"categories": [{"id": "TB58V8F5HTGYM","name": "DESSERTS","sortOrder": 15,"deleted": false}]},{"id": "F4VYPXC1X9J1J","orderRef": {"id": "3T3YN416MASV2"},"item": {"id": "QXBQAMMZR8M6T"},"name": "Veggie Fried Rice","alternateName": "","price": 1199,"itemCode": "","note": "","printed": true,"createdTime": 1702095600000,"orderClientCreatedTime": 1702095600000,"exchanged": false,"refunded": false,"isRevenue": true,"categories": [{"id": "F4HYDJAKE13K0","name": "FRIED RICE","sortOrder": 13,"deleted": false}]},{"id": "ZAECC4E18MB5T","orderRef": {"id": "3T3YN416MASV2"},"item": {"id": "A5JPMS665CQW6"},"name": "Chicken Supreme Bowl /G,O With Bread","alternateName": "","price": 1099,"itemCode": "","note": "grgre","printed": false,"createdTime": 1702095600000,"orderClientCreatedTime": 1702095600000,"exchanged": false,"refunded": false,"isRevenue": true,"categories": [{"id": "55DYZ8T2ZVB88","name": "Bowl","sortOrder": 20,"deleted": false}]}]}]

目标过滤分类

{id: "55DYZ8T2ZVB88", name:"Bowl"}

出错的过滤代码

this.orders.filter((order) => order.lineItems.some(lineItem => lineItem.categories.some(category =>category.id === item.id)));

错误信息

VM67561:1 Uncaught TypeError: Cannot read properties of undefined (reading 'some')

之前正常运行的按商品ID过滤代码

this.orders.filter((order) => order.lineItems.some(lineItem =>lineItem.item.id === item.id));

解决方案

问题根源

错误提示说明某个lineItem的categories属性不存在或为undefined。你提供的示例数据里每个订单项都有分类,但实际业务数据中可能存在未分配分类的订单项,导致调用some方法时触发报错。

修复后的基础代码

在访问lineItem.categories前先做存在性校验,同时明确目标分类ID(避免依赖外部变量item可能带来的问题):

const targetCategoryId = "55DYZ8T2ZVB88";
const filteredOrders = this.orders.filter(order => 
  order.lineItems.some(lineItem => 
    // 用可选链操作符处理categories不存在的情况
    lineItem.categories?.some(category => category.id === targetCategoryId)
  )
);

兼容旧环境的写法(无可选链支持)

如果你的运行环境不支持ES6+的可选链操作符,用短路判断替代:

const targetCategoryId = "55DYZ8T2ZVB88";
const filteredOrders = this.orders.filter(order => 
  order.lineItems.some(lineItem => 
    lineItem.categories && lineItem.categories.some(category => category.id === targetCategoryId)
  )
);

性能优化方案(频繁过滤场景)

如果需要多次执行这类过滤,建议提前缓存每个订单的所有分类ID,后续过滤直接查找缓存,提升效率:

// 预处理订单,缓存每个订单包含的分类ID集合
const ordersWithCachedCategories = this.orders.map(order => ({
  ...order,
  categoryIdSet: new Set(
    order.lineItems.flatMap(lineItem => 
      lineItem.categories ? lineItem.categories.map(cat => cat.id) : []
    )
  )
}));

// 后续过滤直接通过Set判断,时间复杂度O(1)
const targetCategoryId = "55DYZ8T2ZVB88";
const filteredOrders = ordersWithCachedCategories
  .filter(order => order.categoryIdSet.has(targetCategoryId))
  .map(({ categoryIdSet, ...originalOrder }) => originalOrder); // 移除缓存的属性,还原订单结构

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 04:45:54