javascript - 用另一个数组对象过滤一个数组对象
问题描述
我正在尝试过滤数组对象localcartArr
以排除数组中包含的任何对象products
,但它返回相同localcartArr
而不排除此对象:
{ "productID": "5f6fd57f8b6f6b0017992443" }
它存在于products
数组中,它只适用于===
运算符,但不适用于不相等的操作!=
or !==
。
const products = [
{
"_id": "60242abc209cbd32d8e85ec8",
"productID": "5f6fd4f18b6f6b001799243f",
"quantity": 2
},
{
"_id": "60242b00209cbd32d8e85ec9",
"productID": "5f6fd57f8b6f6b0017992443",
"quantity": 1
}
]
let localcartArr = [
{
"productID": "5f6fd57f8b6f6b0017992443",
"quantity": 2
},
{
"productID": "5f6fd12a8b6f6b001799242f",
"quantity": 1
},
{
"productID": "5f7a5668a9baa50017d495e8",
"quantity": 1
}
]
let filterd = localcartArr.filter(local => {
return products.some(product => {
return local.productID !== product.productID
});
});
解决方案
为了反转“一些/相等”,您需要返回“不是每个/不相等”。
这是布尔逻辑中德摩根定律的一个原则。
const products = [{
"_id": "60242abc209cbd32d8e85ec8",
"productID": "5f6fd4f18b6f6b001799243f",
"quantity": 2
}, {
"_id": "60242b00209cbd32d8e85ec9",
"productID": "5f6fd57f8b6f6b0017992443",
"quantity": 1
}];
const localcartArr = [
{ "productID": "5f6fd57f8b6f6b0017992443", "quantity": 2 },
{ "productID": "5f6fd12a8b6f6b001799242f", "quantity": 1 },
{ "productID": "5f7a5668a9baa50017d495e8", "quantity": 1 }
];
let filtered1 = localcartArr.filter(local =>
products.some(product =>
local.productID === product.productID));
let filtered2 = localcartArr.filter(local =>
!products.every(product =>
local.productID !== product.productID));
console.log(filtered1);
console.log(filtered2);
.as-console-wrapper { top: 0; max-height: 100% !important; }
这是相同的程序,但经过简化:
const products = [{
"_id": "60242abc209cbd32d8e85ec8",
"productID": "5f6fd4f18b6f6b001799243f",
"quantity": 2
}, {
"_id": "60242b00209cbd32d8e85ec9",
"productID": "5f6fd57f8b6f6b0017992443",
"quantity": 1
}];
const cart = [
{ "productID": "5f6fd57f8b6f6b0017992443", "quantity": 2 },
{ "productID": "5f6fd12a8b6f6b001799242f", "quantity": 1 },
{ "productID": "5f7a5668a9baa50017d495e8", "quantity": 1 }
];
const filterEqual = (a, b, c) => a.filter(x => b.some(y => (c(x) === c(y))));
const filterNotEqual = (a, b, c) => a.filter(x => !b.every(y => (c(x) !== c(y))));
const filtered1 = filterEqual(cart, products, ({productID}) => productID);
const filtered2 = filterNotEqual(cart, products, ({productID}) => productID);
console.log(filtered1);
console.log(filtered2);
.as-console-wrapper { top: 0; max-height: 100% !important; }
推荐阅读
- vertical-alignment - 如何在 PlantUML 图上垂直显示块?
- android - 尽管设置了尺寸,但 ConstraintLayout 中的自定义视图最终尺寸为 0
- pandas - CoxPHFitter:输入必须至少有 3 个条目
- activemq - ActiveMQ 阻止消费者处理特定消息
- reactjs - 更新firebase数据库后“警告:无法在未安装的组件上调用setState(或forceUpdate)”
- android - Vision BarcodeDetector 不读取数据矩阵条码
- javascript - React - 尝试渲染对象的属性,尽管它保持“未定义”
- linkedin - 尝试从 Linkedin CDN 获取创意图片时出现 403 禁止
- react-admin - React Admin - 可以将产品分配到多个类别吗?
- selenium-webdriver - 如何在 Webdriver 中向 ModalDialog 输入文本