使用另一个对象数组的键来过滤JavaScript中的对象数组

18 浏览
0 Comments

使用另一个对象数组的键来过滤JavaScript中的对象数组

我有一个产品数组和一个用户可以访问的产品数组。它们有一个共同的ID。我想过滤产品数组,只返回用户可以访问的产品。\n所有产品(products)\n[{\n \"productName\": \"我的产品\"\n \"p_id\": \"1\"\n},...\n]\n我的可用产品(myProducts)\n[\n {\n \"i_items\": \"[{\\\"act\\\":\\\"new\\\",\\\"app\\\":\\\"nexus\\\",\\\"type\\\":\\\"package\\\",\\\"cost\\\":\\\"0.00\\\",\\\"tax\\\":null,\\\"quantity\\\":1,\\\"itemName\\\":\\\"我的产品\\\",\\\"itemID\\\":1,\\\"physical\\\":false,\\\"methods\\\":\\\"*\\\",\\\"cfields\\\":[],\\\"extra\\\":null,\\\"renew_term\\\":1,\\\"renew_units\\\":\\\"m\\\",\\\"renew_cost\\\":\\\"100.00\\\",\\\"grace_period\\\":86400}]\"\n },...\n]\n编辑:\n下面的解决方案返回[]\n// 将可用ID提取为Set:\nconst availableIds = new Set(this.myProducts.flatMap(({i_items}) => \n JSON.parse(i_items).map(item => \"\"+item.itemID))\n);\nconsole.log(availableIds); //Set(1) {\"3\"}\n// 使用Set过滤产品:\nconsole.log(availableIds.has(\"3\")); //true\nconst filtered = this.products.filter(({p_id}) => availableIds.has(p_id));\nconsole.log(filtered); // []\n最后一次编辑:感谢所有帮助过我的人。最后的问题是因为没有将id转换为字符串引起的。一旦我将availableIds.has(p_id)改为availableIds.has(\"\"+p_id),它就可以工作了。

0
0 Comments

问题的出现原因是需要根据一个对象数组的键来过滤另一个对象数组。

解决方法是首先解析可用项,然后检查相关的id是否存在。通过以下步骤实现:

1. 定义两个对象数组:

const a = [
     {
       "productName": "My Product",
       "p_id": "1"
     },
     {
       "productName": "My Other Product",
       "p_id": "2"
     }
   ]
   const availableItems = [
     {
       "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}]"
     },
   ]

2. 定义一个函数路径(path)来获取指定键的值:

const path = k => x => x[k];

3. 定义解析可用项的函数(parseAvailable)来将可用项的字符串转换为对象数组:

const parseAvailable = item => JSON.parse(item['i_items']);

4. 定义一个函数(stringify)来将值转换为字符串:

const stringify = x => `${x}`;

5. 定义一个函数(getItemIdAsString)来获取指定对象的itemID并将其转换为字符串:

const getItemIdAsString = x => stringify(path('itemID')(x));

6. 定义一个函数(availabilityChecker)来检查产品是否可用。它接受可用项和产品作为参数,并进行以下操作:

- 解析可用项

- 使用getItemIdAsString函数获取可用项中所有产品的itemID

- 使用indexOf函数检查产品的p_id是否在itemID数组中,如果存在则返回true,否则返回false

const availabilityChecker = available => product => parseAvailable(available)
     .map(getItemIdAsString)
     .indexOf(product['p_id']) > -1;

7. 使用availabilityChecker函数创建一个isProductAvailable函数,用于检查特定产品是否可用:

const isProductAvailable = availabilityChecker(availableItems[0]);

8. 使用isProductAvailable函数检查a数组中每个产品的可用性,并将结果保存在result和resultTwo变量中:

const result = isProductAvailable(a[0]);
   const resultTwo = isProductAvailable(a[1]);

9. 最后,输出result和resultTwo的结果:

console.dir(result);
   console.dir(resultTwo);

以上就是解决问题的步骤和方法。通过解析可用项和检查产品的p_id是否在可用项中的itemID数组中,可以过滤出符合条件的产品。

0
0 Comments

原因:这个问题的出现是因为在使用flatMap函数时,遇到了一个错误,报错信息是Property 'flatMap' does not exist on type '<any>[]'。这是因为在该项目的TypeScript配置文件tsconfig中,没有启用flatMap函数的特性。

解决方法:需要更新tsconfig文件以启用该特性。可以参考stackoverflow上的解决方法,链接为stackoverflow.com/questions/53556409。更新tsconfig文件后,可以解决构建过程中的问题。如果在编辑器(比如VSCode)中仍然遇到问题,需要进一步解决。

以上是原文内容的整理,包括问题的出现原因和解决方法。

0