多对象字段值一致性判断逻辑修复:null/undefined场景结果不符合预期
多对象字段值一致性判断逻辑修复:null/undefined场景结果不符合预期
嘿,我看你碰到的问题是:当第一个选中对象的字段是null/undefined,后面的对象对应字段有实际值时,代码没有返回预期的various,反而直接返回了后面的字段值对吧?咱们来一步步把这个逻辑捋顺修复好。
首先得分析下你当前determineUniformity函数的问题:它在fieldValue为空的时候直接返回recordValue,这就导致如果初始基准值(第一个对象的字段)是null/undefined,第二个对象的字段值会直接覆盖它——但空值和非空值本身就是不一致的,这时候应该返回various才对。
那怎么调整逻辑呢?我们需要覆盖这些场景:
- 初始状态(
fieldValue还没被赋值,也就是undefined):直接把当前recordValue作为基准值 - 一旦字段已经被标记为
various,后续不管什么值都保持various - 当有基准值后,不管基准值是普通值还是
null/undefined,只要和当前recordValue不相等,就返回various;相等则保留基准值
下面是修复后的完整代码:
const determineUniformity = (fieldValue, recordValue) => { // 已经标记为various的话,直接返回,不再修改 if (fieldValue === 'various') { return 'various'; } // 还没有基准值的时候,用当前值作为初始基准 if (fieldValue === undefined) { return recordValue; } // 严格比较基准值和当前值,不等就返回various return fieldValue === recordValue ? fieldValue : 'various'; }; const valuesEvaluator = selectedRecords => { // 测试用例 selectedRecords = [ { name: 'record1', height: null, width: 'width1' }, { name: 'record2', height: 'height2', width: null } ]; let name, height, width; selectedRecords.forEach(record => { name = determineUniformity(name, record.name); height = determineUniformity(height, record.height); width = determineUniformity(width, record.width); }); console.log('name', name); // Output: various -- 正确 console.log('height', height); // Output: various -- 现在符合预期了 console.log('width', width); // Output: various -- 正确 }; valuesEvaluator();
咱们来验证下这个逻辑:
- 对于
height字段,第一个值是null,第二个是height2,两者严格不相等,所以返回various,完美解决你的问题 - 不管是前空后有值、前有值后空,还是任意n个对象,只要有一个值和基准值不一致,就会标记为
various,后续的对象也不会改变这个结果 - 如果需要把
null和undefined视为相同的空值,可以把判断改成fieldValue == recordValue(用双等号),根据你的需求调整就行
备注:内容来源于stack exchange,提问作者Bhupesh
相关产品推荐
相关产品推荐

