【问题标题】:Typescript - To replace the value of a property is it is not the default value打字稿 - 替换属性的值不是默认值
【发布时间】:2019-02-13 05:07:20
【问题描述】:

我有 2 个对象。第一个对象 A 的所有属性的默认值为“启用”。

public A(): any {
    const enabledObject = { enabled: true };
    return {
        property1: enabledObject,
        property2: enabledObject, 
        property3: enabledObject,
        property4: enabledObject,
    };
}

第二个对象有不同的属性

public B(): any {
    const appProperty = { 
        property1: { enabled: true },
        property2: { enabled: false}, 
        property3: { enabled: true },
        property4: { enabled: false},
    };
}

我想返回对象 A 减去对象 B 中指定为 'enabled=false' 的任何属性。

public A(): any {
    const enabledObject = { enabled: true };
    return {
        property1: enabledObject, 
        property3: enabledObject,
    };
}

我正在尝试使用以下方法解决此问题,但它不起作用。

return _.assignInWith(A, B, this.Disabled);

private Disabled(destination: any, source: any, key: any): any {
    const disabledObject = { enabled: false };
    if (_.isUndefined(destination)) {
        return disabledObject;
    }
    return destination;
}

【问题讨论】:

    标签: javascript typescript lodash


    【解决方案1】:

    还有一个不使用lodash的简单解决方案:

    function AmB(): any {
      const a = A();
      const b = B();
      const res = {};
      for (let aKey in a) {
        if (!b[aKey] || b[aKey].enabled) {
          res[aKey] = a[aKey];
        }
      }
      return res;
    }
    

    Stackblitz demo of this example

    【讨论】:

      【解决方案2】:

      虽然我不知道 loadash 语法,但这可以通过 JavaScript(或转换为 Typescript)轻松完成

         var enabledObject = { enabled: true };
          var A = {
            property1: enabledObject,
            property2: enabledObject, 
            property3: enabledObject,
            property4: enabledObject
          };
      
          var B = {
            property1: { enabled: true },
            property2: { enabled: false}, 
            property3: { enabled: true },
            property4: { enabled: false}
          };
      
      
          var diff = {};
          for(var p in A){
              //diff[p] = {};
            //if B does not have the property, add it to result and continue
            if (!B.hasOwnProperty(p)) {
              diff[p] = A[p];
      
            } else {
              if(B[p].hasOwnProperty('enabled') && !B[p]['enabled']) {
                  diff[p] = A[p];
              }
            }
          }
      

      只需在浏览器的控制台上运行此代码并打印 diff 变量

      如果你愿意,你可以进一步概括逻辑来比较两个不同结构的对象并返回差异

      【讨论】:

        【解决方案3】:

        你可以使用lodash实现如下:

        function AmB(): any {
         const a = A();
         const b = B();
        
         const bPairs = _.toPairs(b);
         const bNotEnabled = _.filter(bPairs, bPair => { return !bPair[1].enabled });
         const aPairs = _.toPairs(a);
         const aMinusB = _.reject(aPairs, aPair => _.find(bNotEnabled, b => b[0] === aPair[0]));
         return {...aMinusB}
        }
        

        你可以看到这个工作here

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-05-10
          • 2017-08-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-15
          • 2021-01-04
          • 2019-02-27
          相关资源
          最近更新 更多