【问题标题】:Filter an object of array with another object of array用另一个数组对象过滤一个数组对象
【发布时间】:2021-05-14 14:55:53
【问题描述】:

我正在尝试过滤数组 localcartArr 的对象以排除 products 数组中包含的任何对象,但它返回相同的 localcartArr 而不排除此对象:

{ "productID": "5f6fd57f8b6f6b0017992443" }

存在于products数组中,它只适用于===运算符,但不适用于不等于运算符!=!==

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

【问题讨论】:

标签: javascript arrays dictionary filter


【解决方案1】:

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

这是De Morgan's laws在布尔逻辑中的一个原理。

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

【讨论】:

    【解决方案2】:

    使用您要匹配的属性进行过滤并排除不匹配的属性。

    一些例子:

    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
      }
    ];
    // find matches
    const myArrayFiltered = localcartArr.filter((el) => {
      return products.some((f) => {
        return f.productID === el.productID;
      });
    });
    
    console.log(myArrayFiltered);
    
    //filter out matches
    const notIn = localcartArr.filter((el) => {
      return myArrayFiltered.some((f) => {
        return f.productID !== el.productID;
      });
    });
    
    console.log(notIn);
    
    // to put it together (for clarity)
    // not that this is not super efficient if you have a large pair of sets
    const notInX = localcartArr.filter((el) => {
      return  localcartArr.filter((el) => {
      return products.some((f) => {
        return f.productID === el.productID;
      });
    }).some((f) => {
        return f.productID !== el.productID;
      });
    });
    console.log(notInX);

    【讨论】:

      猜你喜欢
      • 2018-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-16
      • 2019-05-05
      相关资源
      最近更新 更多