筛选键含_order且值大于${section.name}_order的对象属性出错排查
问题分析与解决
嗨,我来帮你拆解这段代码的问题以及后续修正后能正常运行的原因:
最初代码的核心问题
先看你最初写的代码:
const sectionsAfter = Object.keys(res.data()).filter((item) => ( item.includes('_order') && res.data()[item] > `${section.name}_order` ))
这里最关键的错误是类型不匹配:你用模板字符串${section.name}_order生成了一个字符串,然后拿它去和res.data()[item](大概率是数值类型的排序值,比如1、3、5这类)做比较。
JavaScript里字符串和数值比较时会做隐式类型转换,但转换规则很容易出问题——比如数值10和字符串"2"比较,会把10转成字符串"10",然后按字符顺序对比,"10" > "2"会返回false,这完全不符合你想要的数值大小比较逻辑,自然得不到预期结果。
修正后正常运行的原因
你提到后来修正了传入的数据,让${section.name}_order返回了预期的数值(而不是之前错误的字符串或者无效值),这样两边都是数值类型,大小比较就符合逻辑了,代码也就正常工作啦。
两个实用优化建议
最后给你两个小优化,让代码更健壮:
- 避免重复调用
res.data(),先把数据存到变量里,既能提升性能,也更易读:const sectionData = res.data(); // 先拿到目标排序值,确保是数值类型 const targetOrder = sectionData[`${section.name}_order`]; const sectionsAfter = Object.keys(sectionData).filter(item => item.includes('_order') && sectionData[item] > targetOrder ); - 增加类型校验,防止后续再出现类似的类型问题:
const sectionData = res.data(); const targetKey = `${section.name}_order`; const targetOrder = sectionData[targetKey]; // 兜底处理:如果目标值不是有效数值,直接返回空数组或者做其他处理 if (typeof targetOrder !== 'number') { console.warn(`目标排序字段${targetKey}的值不是有效数值`); return []; } const sectionsAfter = Object.keys(sectionData).filter(item => item.includes('_order') && typeof sectionData[item] === 'number' && sectionData[item] > targetOrder );
内容的提问来源于stack exchange,提问作者Nichlas Wærnes Andersen
相关产品推荐
相关产品推荐

