Javascript按另一个对象数组的键过滤对象数组

时间:2019-04-25 09:16:24

标签: javascript arrays node.js

我有一系列产品和用户可以访问的一系列产品。它们共享一个公共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),它就起作用了。

2 个答案:

答案 0 :(得分:2)

您可以使用mapJSON.parse从第二个数据集中提取itemID值,并将其转换为Set。然后使用该集合对产品数据应用filter

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

答案 1 :(得分:1)

正如其他人所说,这是解析可用项目,然后检查是否存在相关ID的情况:

Iterator<? extends ICard> iterator(