在JS中提取嵌套数组的supplier属性并去重为字符串数组
提取嵌套数组中supplier属性并去重的简洁实现
需求说明
我需要从嵌套数组中提取supplier属性,想要更优更简洁的实现方式,同时重复值仅显示一次,预期输出为 ['Moscow', 'USA']。
现有实现代码
const oldData = [ { "uid": "AA1", "members": [ { "id": 123, "createdTs": "2018-11-07T04:55:00.000+00:00", "modifiedTs": "2022-03-17T23:29:06.000+00:00", "uid": "d@yahoo.com", "name": "Dayanara", "active": true, "lastLogin": "2020-10-28T03:22:22.000+00:00", "supplier": "Moscow" }, { "id": 456, "createdTs": "2018-10-28T22:42:57.000+00:00", "modifiedTs": "2020-06-01T05:01:11.000+00:00", "uid": "j@yahoo.com", "name": "John Jones", "active": true, "lastLogin": "2020-06-01T05:00:35.000+00:00", "supplier": null }, { "id": 789, "createdTs": "2022-01-28T05:21:37.000+00:00", "modifiedTs": "2022-02-04T06:24:54.000+00:00", "uid": "g@gmail.com", "name": "Gasmund", "active": true, "lastLogin": null, "supplier": "" } ] }, { "uid": "AA2", "members": [ { "id": 10112, "createdTs": "2022-07-07T09:51:14.000+00:00", "modifiedTs": "2022-07-07T09:51:14.000+00:00", "uid": "aa@yahoo.com", "name": "deqwd", "active": true, "lastLogin": null, "supplier": "USA" }, { "id": 101123, "createdTs": "2022-07-07T09:51:14.000+00:00", "modifiedTs": "2022-07-07T09:51:14.000+00:00", "uid": "aa33@yahoo.com", "name": "fewfewffwef", "active": true, "lastLogin": null, "supplier": "USA" } ] } ] const newData = oldData.flatMap((groupUsers) => ( groupUsers.members.map(({ supplier }) => ({ supplier: supplier })) )); console.log(newData)
优化实现方案
可以通过扁平化提取+过滤无效值+去重的链式调用实现更简洁高效的代码,直接得到预期的结果数组:
const suppliers = [...new Set( oldData.flatMap(group => group.members.map(member => member.supplier)) .filter(supplier => supplier) )]; console.log(suppliers); // 输出: ['Moscow', 'USA']
代码解释
flatMap直接提取所有层级的supplier值,避免生成额外的对象数组,比原代码更轻量化filter(supplier => supplier)过滤掉null、空字符串等无效值(这些不是有效供应商),如果需要更严谨的过滤逻辑,也可以写成filter(s => s !== null && s !== '')new Set()自动实现去重,最后用扩展运算符[...]将Set转换回数组,得到唯一的有效供应商列表
内容的提问来源于stack exchange,提问作者Joseph
相关产品推荐
相关产品推荐

