【问题标题】:Trying to match values in two arrays and only delete if there is an exact match for part of the value尝试匹配两个数组中的值,并且仅在部分值完全匹配时才删除
【发布时间】:2016-12-28 05:56:03
【问题描述】:

我收到了两个格式不同的 IP 地址数组。 IPs 数组中的任何值都应该从地址数组中删除 - 但前提是 IPs 完全匹配。我已经写了下面的内容,但问题是,例如,192.168.0.1 将匹配 192.168.0.11,然后从地址数组中删除 192.168.0.11,这不是有效的结果。地址数组需要以与接收时相同的格式返回。请问有什么帮助吗? :)

var addresses = [{
    Value : '192.168.0.11'
}, {
    Value : '52.210.29.181'
}, {
    Value : '52.210.128.97'
}
];

var IPs = ['192.168.0.1', '52.210.128.97'];

console.log('Before:', addresses);

for (var x = 0; x < IPs.length; x++) {  

for (var key in addresses) {
    var address = JSON.stringify(addresses[key]);

    if (address.indexOf(IPs[x]) > -1){ //if the IP is a substr of address

        console.log('matched, so delete', addresses[key]);
        var index = addresses.indexOf(addresses[key]); //find the index of IP to be deleted then delete it
        addresses.splice(index, 1);

    }


}
}

console.log('After', addresses);

【问题讨论】:

  • address 是一个字符串,您似乎将其视为字符串数组。尝试地址==(或者可能===)IP [x] 是否不合逻辑?

标签: javascript arrays node.js string-matching


【解决方案1】:

编辑:

ES6 语法(Array.filter & Array.include & Arrow 函数)

const addresses = [
  {
Value: "192.168.0.11",
  },
  {
Value: "52.210.29.181",
  },
  {
Value: "52.210.128.97",
  },
];

const IPs = ["192.168.0.1", "52.210.128.97"];

const filterdAddresses = addresses.filter((item) => !IPs.includes(item.Value));

console.log(filterdAddresses);

原答案:

使用Array.filter 的干净方法:

    var addresses = [{
       Value: '192.168.0.11'
       },
      {
       Value: '52.210.29.181'
      }, {
      Value: '52.210.128.97'
    }];
    
    var IPs = ['192.168.0.1', '52.210.128.97'];
    
    var filterdAddresses = addresses.filter(function (item) {
        var match = false;
        IPs.forEach(function (ip) {
            if (item.Value == ip) {
                match = true;
            }
    
        });
        return !match;
    
    });
    
    console.log(filterdAddresses);

【讨论】:

  • 好方法。
【解决方案2】:

我提议一个 forEach 和一个这样的拼接:

addresses.forEach((item, index, arr) => {if (IPs.indexOf(item.Value) != -1) arr.splice(index,1)});

console.log(addresses); //[ { Value: '192.168.0.11' }, { Value: '52.210.29.181' } ]

【讨论】:

    【解决方案3】:

    我会按如下方式完成这项工作;

    var   ips = ['192.168.0.1', '52.210.128.97'],
    addresses = [{Value : '192.168.0.11'},
                 {Value : '52.210.29.181'},
                 {Value : '52.210.128.97'}
                ],
       result = addresses.map(obj => obj.Value)
                         .filter(ip => !ips.includes(ip));
    console.log(result);

    【讨论】:

      【解决方案4】:

      var addresses = [{
          Value: '192.168.0.11'
      }, {
          Value: '52.210.29.181'
      }, {
          Value: '52.210.128.97'
      }];
      
      var IPs = ['192.168.0.1', '52.210.128.97'];
      
      
      // Loop through IPs
      IPs_loop:
      for (var ipIndex = 0; ipIndex < IPs.length; ipIndex++) {
      
          var currentIP = IPs[ipIndex];
      
          // loop through addresses
          for (var adsIndex = 0; adsIndex < addresses.length; adsIndex++) {
      
              var currentAds = addresses[adsIndex];
              if (currentAds.Value == currentIP) {
                  removeAddressFromIndex(adsIndex);
                  break IPs_loop;
              }
          } // end of addresses Loop
      
      } // end of IPs Loop
      
      function removeAddressFromIndex(theReceivedIndex) {
          addresses.splice(theReceivedIndex, 1);
      }
      
      console.log(addresses);


      (关于IPs_loop(标签和声明))

      【讨论】:

        【解决方案5】:

        此解决方案比其他解决方案更有效。

        var addresses = [{
            Value : '192.168.0.11'
        }, {
            Value : '52.210.29.181'
        }, {
            Value : '52.210.128.97'
        }
        ];
        
        var IPs = ['192.168.0.1', '52.210.128.97'];
        
        var obj =  {};
        addresses.forEach(function(a, i) { obj[a.Value] = i; });
        IPs.forEach(function(i) { if (obj[i] != null) addresses.splice(obj[i],1); }); 
        
        console.log(addresses);

        【讨论】:

          【解决方案6】:

          @Sabbir 方法的小更新:

          var addresses = [
              {
                  Value: '192.168.0.11'
              },
              {
                  Value: '52.210.29.181'
              }, 
              {
                  Value: '52.210.128.97'
              }];
              
          var IPs = ['192.168.0.1', '52.210.128.97'];
          
          var filterdAddresses = addresses.filter(function (item) {
              // If the value exists in IPs array, indexOf will return the index of that value, otherwise it will return -1
              // And if it returns -1 then it didn't match so we return 'true', as we won't filter/remove it
              return (IPs.indexOf(item.Value) == -1);    
          });
              
          console.log(filterdAddresses); //[ { Value: '192.168.0.11' }, { Value: '52.210.29.181' } ]

          【讨论】:

            【解决方案7】:

            使用类似的东西

            var res = [];
            
            var addresses = [{
              Value : '192.168.0.11'
            }, {
              Value : '52.210.29.181'
            }, {
              Value : '52.210.128.97'
            }];
            
            var IPs = ['192.168.0.1', '52.210.128.97'];
            
            console.log('Before:', addresses);
            
            addresses.forEach(function(addr) {
              IPs.forEach(function(ip) {
                if (addr.Value === ip) res.push(addr);
              });
            });
            
            console.log('After', res);    
            

            在 res 中你只会得到 ​​p>

            { Value: '52.210.128.97' }
            

            【讨论】:

              猜你喜欢
              • 2021-05-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-03-10
              • 1970-01-01
              • 2019-02-08
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多