首页 > 解决方案 > Javascript通过另一个对象数组的键过滤对象数组

问题描述

我有一系列产品和用户可以访问的一系列产品。他们共享一个共同的 ID。我想过滤产品数组以仅返回用户有权访问的产品。

所有产品 ( products)

[{
  "productName": "My Product"
   "p_id": "1"
},...
]

我的可用产品 ( myProducts)

[
  {
    "i_items": "[{\"act\":\"new\",\"app\":\"nexus\",\"type\":\"package\",\"cost\":\"0.00\",\"tax\":null,\"quantity\":1,\"itemName\":\"My Product\",\"itemID\":1,\"physical\":false,\"methods\":\"*\",\"cfields\":[],\"extra\":null,\"renew_term\":1,\"renew_units\":\"m\",\"renew_cost\":\"100.00\",\"grace_period\":86400}]"
  },...
]

编辑:

以下解决方案返回 []

// Extract available IDs into a Set:
const availableIds = new Set(this.myProducts.flatMap(({i_items}) => 
    JSON.parse(i_items).map(item => ""+item.itemID))
);
console.log(availableIds); //Set(1) {"3"}
// Use the Set to filter the products:
console.log(availableIds.has("3")); //true
const filtered = this.products.filter(({p_id}) => availableIds.has(p_id));
console.log(filtered); // []

最终编辑:感谢所有帮助过的人。最后一个问题是由于没有将 id 转换为字符串引起的。一旦我改变了availableIds.has(p_id)->availableIds.has(""+p_id)它就起作用了。

标签: javascriptarraysnode.js

解决方案


您可以使用mapand从第二个数据集中JSON.parse提取itemID值,并将它们转换为Set. 然后filter使用该集合对产品数据应用 a:

// Sample data
const allProducts = [{"productName": "My Product","p_id": "1"},{"productName": "My unused Product","p_id": "4"},{"productName": "My Other Product","p_id": "5"},{"productName": "My unused Product 2","p_id": "6"},{"productName": "My luxury Product","p_id": "9"},{"productName": "My lucky Product","p_id": "13"}];
const available = [{"i_items": "[{\"itemID\":1},{\"itemID\":13}]"},{"i_items": "[{\"itemID\":5},{\"itemID\":9}]"}];

// Extract available IDs into a Set:
const availableIds = new Set(available.flatMap(({i_items}) => 
    JSON.parse(i_items).map(item => ""+item.itemID))
);
// Use the Set to filter the products:
const filtered = allProducts.filter(({p_id}) => availableIds.has(p_id));
console.log(filtered);


推荐阅读