You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据指定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);

代码说明:

  1. 筛选逻辑:

    • 用reduce将每个元素的Attribute数组转换为键值对映射(attrMap),避免多次遍历数组查找属性
    • 直接通过映射验证id和commodity是否符合条件
  2. 格式转换:

    • 用find定位unit属性,将其值转为整数类型
    • 提取attributes中的Code和最后一个Name值(因对象重复键会被后续值覆盖,原数据中第二个Name即为最终保留值)

内容的提问来源于stack exchange,提问作者Roma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 14:10:25