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

如何重构isSame函数以支持传入属性名字符串(建议重命名为isPropValueSame)?

重构比较函数以支持动态属性名

要实现动态传入属性名的需求,把isPropValueSame改成高阶函数就可以了——先接收要比较的属性名,返回一个符合_.differenceWith要求的双参数比较函数,这样就能通过this.isPropValueSame('id')的方式灵活指定比较属性。

重构后的完整代码

import * as _ from 'lodash';

// 重命名为isPropValueSame,改为高阶函数
isPropValueSame = (propName: string) => {
  return (objA: any, objB: any) => {
    // 确保两个对象都有目标属性,再比较值
    return _.has(objA, propName) && _.has(objB, propName) 
      ? objA[propName] === objB[propName] 
      : false;
  };
};

// 使用时传入属性名,生成对应的比较函数
const diff = _.differenceWith(sourceList, comparatorList, this.isPropValueSame('id'));

测试验证

用你提供的测试数据验证:

const someValue = 'test';
const prop3Value = 'demo';

const sourceList = [
    { id: 1, prop2: { prop21: someValue }, prop3: prop3Value },
    { id: 2, prop2: { prop21: someValue }, prop3: prop3Value },
    { id: 3, prop2: { prop21: someValue }, prop3: prop3Value },
];
const comparatorList = [
    { id: 1, prop2: { prop21: someValue }, prop3: prop3Value },
    // 注释掉id=2的项
    { id: 3, prop2: { prop21: someValue }, prop3: prop3Value },
];

// 计算差异
const diffResult = _.differenceWith(sourceList, comparatorList, this.isPropValueSame('id'));
console.log(diffResult); // 输出 [{ id: 2, prop2: { prop21: 'test' }, prop3: 'demo' }]

补充说明

  • 高阶函数的设计完美适配_.differenceWith的要求:这个方法需要一个接收两个对象、返回布尔值的回调,我们通过先传属性名生成这个回调,实现了动态指定比较属性的能力。
  • 保留了原逻辑中“两个对象都存在目标属性才比较”的判断,避免因属性缺失抛出错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 10:20:30