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

Trying to match values in two arrays and only delete if there is an exact match for part of the value

我收到两个 IP 地址数组,它们的格式不同。 IPs 数组中的任何值都应从地址数组中删除 - 但前提是 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);

我建议这样一个 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 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' }

编辑:

ES6 syntax (Array.filter & Array.include & Arrow function)

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

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

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


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

这个解决方案比其他解决方案更有效。

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