【问题标题】:Filter out an array from another array [duplicate]从另一个数组中过滤出一个数组[重复]
【发布时间】:2017-11-27 11:06:09
【问题描述】:

所以我有 2 个对象数组,看起来像这样

    this.balanceCodes = [
        { ID: 1, StringValue: "dummy" },
        { ID: 2, StringValue: "data" }
    ];
    this.allCodes = [
        { ID: 1, StringValue: "dummy", Color: "red", Order: "low" },
        { ID: 2, StringValue: "data", Color: "green", Order: "medium" },
        { ID: 3, StringValue: "extra", Color: "black", Order: "low" },
        { ID: 4, StringValue: "options", Color: "grey", Order: "high" }
    ];

我想过滤掉this.balanceCodes中的对象(基于ID)

所以想要的结果是:

    this.result = [
        { ID: 3, StringValue: "extra", Color: "black", Order: "low" },
        { ID: 4, StringValue: "options", Color: "grey", Order: "high" }
    ];

我怎样才能做到这一点?我知道我可以很容易地过滤掉一个对象,但是我怎样才能为整个对象数组做到这一点呢?

我可以使用 Lodash。

【问题讨论】:

    标签: javascript angular typescript lodash


    【解决方案1】:

    使用_.differenceBy() 在第一个数组 (allCodes) 中查找在第二个数组 (balanceCodes) 中找不到的项:

    var balanceCodes = [
        { ID: 1, StringValue: "dummy" },
        { ID: 2, StringValue: "data" }
    ];
    var allCodes = [
        { ID: 1, StringValue: "dummy", Color: "red", Order: "low" },
        { ID: 2, StringValue: "data", Color: "green", Order: "medium" },
        { ID: 3, StringValue: "extra", Color: "black", Order: "low" },
        { ID: 4, StringValue: "options", Color: "grey", Order: "high" }
    ];
    
    var result = _.differenceBy(allCodes, balanceCodes, 'ID');
    
    console.log(result);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

    【讨论】:

      【解决方案2】:

      您可以通过使用filterevery 来实现这一点,而不必使用lodash:

      var balanceCodes = [
          { ID: 1, StringValue: "dummy" },
          { ID: 2, StringValue: "data" }
      ];
      
      var allCodes = [
          { ID: 1, StringValue: "dummy", Color: "red", Order: "low" },
          { ID: 2, StringValue: "data", Color: "green", Order: "medium" },
          { ID: 3, StringValue: "extra", Color: "black", Order: "low" },
          { ID: 4, StringValue: "options", Color: "grey", Order: "high" }
      ];
      
      var result = allCodes.filter((code) => 
        balanceCodes.every((balanceCode) => balanceCode.ID !== code.ID));
      
      console.log(result);

      【讨论】:

        【解决方案3】:

        _.remove 将是您最好的选择。如果 ID 是唯一的 - 这样就足够了(使用 lodash):

        for( let balanceCode of balanceCodes){
            _.remove( allCodes, (code) => { code.ID === balanceCode.ID })
        }
        

        【讨论】:

          猜你喜欢
          • 2022-01-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-02-03
          • 1970-01-01
          • 1970-01-01
          • 2016-12-30
          相关资源
          最近更新 更多