【问题标题】:Making a array on the basis of certain attributes根据某些属性制作数组
【发布时间】:2023-01-26 21:28:11
【问题描述】:

我有一个数组如下:

  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"
     }
    }
  ]
}
}
    ]

如果“AttributeName”是“id”并且 AttributeValue 是“PROD”并且“AttributeName”是“commodity”并且 AttributeValue 是“Rice”或“Barley”,那么我必须从这个数组中得到一个数组。那么我的最终数组将如下所示:

finalArray = [
{
 "code":"ABC",
 "description":"Russia",
 "unit":1
},
{
 "code":"CDF",
 "description":"INDIA",
 "unit":2
}
]

代码值将是“代码”的值,描述将是“名称”,单位值将来自以属性名称作为单位的 AttributeList。这该怎么做?

【问题讨论】:

  • array.reduce() 函数是你的朋友
  • 请添加给定数据的结果。和代码,你试过了。
  • @YosiLeibman 为什么要使用数组 reduce?我认为 array map 是你的朋友 :)

标签: javascript arrays


【解决方案1】:

您可以结合使用Array.map()Array.find()来实现您的目标。

我会使用 JSON.parse() 方法来不必使用方括号,但如果你不想这样做,这里的代码可能会有所帮助:

let formatted = data.map((item, index, arr) => {
    let attributes = item['attributes']
    let unit = item['AttributeList']['Attribute'].find(obj => obj['attributes']['AttributeName'] === 'unit')['attributes']['AttributeValue'];
    return {
        "code": attributes['Code'],
        "description": attributes['Name'],
        "unit": unit
    }
});

console.log(formatted);
  • 你有一个语法错误,其中一个对象后面有一个点而不是逗号。

希望能帮助到你。


【讨论】:

  • 在您检查我提到的条件的代码中。 “AttributeName”是“id”,AttributeValue 是“PROD”,“AttributeName”是“commodity”,AttributeValue 是“Rice”或“Barley”。
【解决方案2】:

你的对象有重复的键名称

"attributes": {
   "Name":"Material",
   "Code":"ABC",
   "Name":"Russia"
},

考虑没有重复键https://jsfiddle.net/aditya76/ar7q2knh

    let ans = data.map(d => {
        let code = d.attributes.Code;
        let name = d.attributes.Name;
        let unit = d.AttributeList.Attribute.find(x => x.attributes.AttributeName == 'unit');
        return {
          "code": code,
          "description": name,
          "unit": unit.attributes.AttributeValue
        };
    });

    console.log(ans);

【讨论】:

  • 在您检查我提到的条件的代码中。 “AttributeName”是“id”,AttributeValue 是“PROD”,“AttributeName”是“commodity”,AttributeValue 是“Rice”或“Barley”。 –
  • 你的代码给了我 3 个元素,但根据我提到的条件,它应该只给我两个元素
猜你喜欢
  • 1970-01-01
  • 2019-07-09
  • 2022-09-23
  • 2021-11-14
  • 2020-12-05
  • 2021-10-26
  • 2016-02-15
  • 1970-01-01
  • 2012-12-20
相关资源
最近更新 更多