尝试匹配两个数组中的值,并且只有在部分值完全匹配时才会删除

我收到两个IP地址arrays,格式不同。 IP数组中的任何值都应该从地址数组中删除,但只有在IP匹配的情况下。 我写了下面,但问题是,例如,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); 

使用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); 

我build议一个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' } ] 

我会做这个工作如下:

 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); 
 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); 

这个解决scheme比其他解决scheme更有效率。

 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); 

对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' } ] 

使用类似的东西

 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); 

在水库你只会得到

 { Value: '52.210.128.97' }