如何实现忽略serialNo的compareRobots函数以比较机器人特征
实现忽略serialNo的机器人对象比较函数
需求明确:编写compareRobots函数,接收两个机器人对象,忽略唯一标识serialNo,只要其余所有键值对完全匹配(属性顺序不影响)就返回true,否则返回false。属性值不会是undefined或NaN。
你当前的代码存在两个核心问题:
- 未排除
serialNo属性,会把这个唯一标识纳入比较逻辑 - 依赖
Object.entries的返回顺序,一旦两个对象属性顺序不同就会直接返回false,不符合「属性顺序不影响」的要求
解决方案代码
我们可以通过过滤掉serialNo属性后,再比较剩余键值对的方式实现,以下是两种简洁可靠的写法:
写法一:直接过滤键并验证
const compareRobots = (robot1, robot2) => { // 过滤出两个对象中除serialNo外的所有键 const keys1 = Object.keys(robot1).filter(key => key !== 'serialNo'); const keys2 = Object.keys(robot2).filter(key => key !== 'serialNo'); // 键数量不同直接返回false if (keys1.length !== keys2.length) return false; // 遍历每个键,验证另一个对象是否有相同键且值相等 for (const key of keys1) { if (!robot2.hasOwnProperty(key) || robot1[key] !== robot2[key]) { return false; } } return true; };
写法二:解构删除serialNo后比较
const compareRobots = (robot1, robot2) => { // 工具函数:返回去掉serialNo的对象副本 const stripSerial = (robot) => { const { serialNo, ...restProps } = robot; return restProps; }; const robot1Clean = stripSerial(robot1); const robot2Clean = stripSerial(robot2); // 键数量不一致直接返回false if (Object.keys(robot1Clean).length !== Object.keys(robot2Clean).length) return false; // 遍历验证所有键值对 for (const [key, value] of Object.entries(robot1Clean)) { if (robot2Clean[key] !== value) return false; } return true; };
测试验证
用你给出的示例测试,结果完全符合预期:
const charlie = { serialNo: 1, chipVer: 12 }; const lordy = { serialNo: 2, chipVer: 12 }; compareRobots(charlie, lordy); // true const paul = { serialNo: 3, chipVer: 15 }; compareRobots(paul, charlie); // false const mike = { serialNo: 4, chipVer: 12, wheels: 1 }; compareRobots(mike, charlie); // false const max = { serialNo: 5, engineVer: 12 }; compareRobots(max, charlie); // false const steve = { serialNo: 6 }; compareRobots(steve, charlie); // false
内容的提问来源于stack exchange,提问作者Vladyslav Akopov
相关产品推荐
相关产品推荐

