【问题标题】:How to get array items that not include in another array in Javascript [duplicate]如何在Javascript中获取不包含在另一个数组中的数组项[重复]
【发布时间】:2020-11-01 18:56:51
【问题描述】:

我正在寻找一种算法来获取一个数组中不在另一个数组中的所有对象。所以给定这些数组:

let snap = [
             {
                "text": "pack bags",
                "Id": 0,
                "datetime": "16/10/2020 @ 21:26:2"
             }
           ];

  let data = [
                {
                  "text": "pack bags",
                  "Id": 0,
                  "datetime": "16/10/2020 @ 21:26:2"
                },
                {
                   "text": "booking tickets",
                   "Id": 1,
                   "datetime": "1/11/2020 @ 22:18:17"
                }
            ];

我想得到这个数组:

updateData = [
               {
                 "text": "booking tickets",
                 "Id": 1,
                 "datetime": "1/11/2020 @ 22:18:17"
               }
             ]

【问题讨论】:

    标签: javascript filter


    【解决方案1】:

    您可以使用Map 对象来拥有O(1),同时在过滤时访问项目:

    const maps = new Map(snap.map(s => [s.Id, s]));
    const result = data.filter(f => !maps.get(f.Id))
    

    一个例子:

    let snap = [
      {
         "text": "pack bags",
         "Id": 0,
         "datetime": "16/10/2020 @ 21:26:2"
      }
    ];
    
    let data = [
         {
           "text": "pack bags",
           "Id": 0,
           "datetime": "16/10/2020 @ 21:26:2"
         },
         {
            "text": "booking tickets",
            "Id": 1,
            "datetime": "1/11/2020 @ 22:18:17"
         }
     ];
    
    
     const maps = new Map(snap.map(s => [s.Id, s]));
     const result = data.filter(f => !maps.get(f.Id))
     console.log(result)

    【讨论】:

      【解决方案2】:

      您可以使用filtersome 的组合来执行此操作:

      let snap = [
        {
          text: 'pack bags',
          Id: 0,
          datetime: '16/10/2020 @ 21:26:2',
        },
      ];
      
      let data = [
        {
          text: 'pack bags',
          Id: 0,
          datetime: '16/10/2020 @ 21:26:2',
        },
        {
          text: 'booking tickets',
          Id: 1,
          datetime: '1/11/2020 @ 22:18:17',
        },
      ];
      
      console.log(data.filter(d => !snap.some(s => s.Id === d.Id)));

      【讨论】:

        【解决方案3】:

        你可以使用数组filter方法。 Filter 方法为每个元素运行一个函数,并返回所有通过测试的数组元素。

        let snap = [
          {
            text: 'pack bags',
            Id: 0,
            datetime: '16/10/2020 @ 21:26:2',
          },
        ];
        
        let data = [
          {
            text: 'pack bags',
            Id: 0,
            datetime: '16/10/2020 @ 21:26:2',
          },
          {
            text: 'booking tickets',
            Id: 1,
            datetime: '1/11/2020 @ 22:18:17',
          },
        ];
        
        const ret = data.filter((x) => snap.filter((y) => y.Id === x.Id).length === 0);
        console.log(ret);

        【讨论】:

          【解决方案4】:

          您可以使用此问题中发布的解决方案检查完整的对象 Object comparison in JavaScript 用于在您的过滤器功能中进行比较,例如:

          let snap = [
               {
                  "text": "pack bags",
                  "Id": 0,
                  "datetime": "16/10/2020 @ 21:26:2"
               }
             ];
          
          let data = [
                  {
                    "text": "pack bags",
                    "Id": 0,
                    "datetime": "16/10/2020 @ 21:26:2"
                  },
                  {
                     "text": "booking tickets",
                     "Id": 1,
                     "datetime": "1/11/2020 @ 22:18:17"
                  }
              ];
          var final = data.filter(function(x) {
              return !snap.some(function(y) {
                  return JSON.stringify(x) == JSON.stringify(y);
              })
          });
          console.log(final);

          【讨论】:

            【解决方案5】:
                let snap = [
              {
                text: "pack bags",
                Id: 0,
                datetime: "16/10/2020 @ 21:26:2",
              },
            ];
            
            let data = [
              {
                text: "pack bags",
                Id: 0,
                datetime: "16/10/2020 @ 21:26:2",
              },
              {
                text: "booking tickets",
                Id: 1,
                datetime: "1/11/2020 @ 22:18:17",
              },
            ];
            let exclude = snap.map((_) => _.Id);
            let array = data.filter((_) => !exclude.includes(_.Id));
            console.log(array);
            

            【讨论】:

              猜你喜欢
              • 2012-11-09
              • 1970-01-01
              • 2018-08-01
              • 2015-10-20
              • 2013-05-06
              • 1970-01-01
              • 2014-05-24
              • 2019-07-15
              • 2013-02-21
              相关资源
              最近更新 更多