尝试匹配两个数组中的值,并且仅在部分值完全匹配时才删除
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' } ]
我收到两个 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' } ]