如何根据指定Attribute条件从data数组生成目标finalArray?
数据筛选与格式转换需求
给定如下data数组:
data = [ { "attributes": { "Name":"Material", "Code":"ABC", "Name":"Russia" }, "AttributeList":{ "Attribute":[ { "attributes":{ "AttributeName":"id", "AttributeValue":"PROD" } }, { "attributes":{ "AttributeName":"commodity", "AttributeValue":"Rice" } }, { "attributes":{ "AttributeName":"unit", "AttributeValue":"1" } } ] } }, { "attributes": { "Name":"Material", "Code":"CDF", "Name":"INDIA" }, "AttributeList":{ "Attribute":[ { "attributes":{ "AttributeName":"id", "AttributeValue":"PROD" } }, { "attributes":{ "AttributeName":"commodity", "AttributeValue":"Barley" } }, { "attributes":{ "AttributeName":"unit", "AttributeValue":"2" } } ] } }, { "attributes": { "Name":"Material", "Code":"DEF", "Name":"UK" }, "AttributeList":{ "Attribute":[ { "attributes":{ "AttributeName":"id", "AttributeValue":"PC" } }, { "attributes":{ "AttributeName":"commodity", "AttributeValue":"PulSe" } }, { "attributes":{ "AttributeName":"unit", "AttributeValue":"3" } } ] } } ]
需要筛选出满足以下条件的元素:
AttributeList.Attribute中存在AttributeName为"id"且AttributeValue为"PROD"的项- 同时存在
AttributeName为"commodity"且AttributeValue为"Rice"或"Barley"的项
将符合条件的元素转换为如下结构的finalArray:
finalArray = [ { "code":"ABC", "description":"Russia", "unit":1 }, { "code":"CDF", "description":"INDIA", "unit":2 } ]
转换规则:
code取原元素attributes中的"Code"值description取原元素attributes中的最后一个"Name"值(原对象重复键会被覆盖,实际为第二个定义的"Name")unit取AttributeList.Attribute中AttributeName为"unit"的AttributeValue,并转换为数字
实现方案(JavaScript)
通过数组的filter方法筛选符合条件的元素,再用map方法转换格式,代码如下:
// 定义目标商品列表 const targetCommodities = ['Rice', 'Barley']; const finalArray = data .filter(item => { // 把Attribute数组转为键值对映射,方便快速查找 const attrMap = item.AttributeList.Attribute.reduce((map, attrItem) => { const key = attrItem.attributes.AttributeName; const value = attrItem.attributes.AttributeValue; map[key] = value; return map; }, {}); // 验证筛选条件 return attrMap.id === 'PROD' && targetCommodities.includes(attrMap.commodity); }) .map(item => { // 找到unit属性并转数字 const unitAttr = item.AttributeList.Attribute.find(attr => attr.attributes.AttributeName === 'unit'); const unit = parseInt(unitAttr.attributes.AttributeValue, 10); // 提取所需字段 return { code: item.attributes.Code, description: item.attributes.Name, unit: unit }; }); console.log(finalArray);
代码说明:
筛选逻辑:
- 用
reduce将每个元素的Attribute数组转换为键值对映射(attrMap),避免多次遍历数组查找属性 - 直接通过映射验证
id和commodity是否符合条件
- 用
格式转换:
- 用
find定位unit属性,将其值转为整数类型 - 提取
attributes中的Code和最后一个Name值(因对象重复键会被后续值覆盖,原数据中第二个Name即为最终保留值)
- 用
内容的提问来源于stack exchange,提问作者Roma
相关产品推荐
相关产品推荐

