首页 > 解决方案 > 用另一个数组对象过滤一个数组对象

问题描述

我正在尝试过滤数组对象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    
  });
});

标签: javascriptarraysdictionaryfilter

解决方案


为了反转“一些/相等”,您需要返回“不是每个/不相等”。

这是布尔逻辑中德摩根定律的一个原则。

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


推荐阅读