使用输入数组中的元素创建新数组

时间:2017-04-25 20:08:05

标签: javascript jquery arrays

我有一个如下所示的数组

[{
    "IM_Id":1,
    "IM_Name":"Hello",
    "ItemNumber":2001,
    "FE_Id":2,
    "FE_Name":"Wall",
    "FE_Code":"XYZ",
    "FC_Id":[2,3],
    "FC_Name":["ABC","PQR"],
    "FC_Value":[9,7],
    "OC_Id":6,
    "OC_Name":"Rai",
    "OC_Price":"$30",
    "CH_Id":4,
    "CH_Name":"Sen",
    "CH_Code":"LMN",
    "CO_Id":[5,9],
    "CO_Name":["xyz","pqr"],
    "CO_Value":["qqq","LMN"]
},
 {
     "IM_Id":2,
     "IM_Name":"World",
     "ItemNumber":2002,
     "FE_Id":3,
     "FE_Name":"WallMart",
     "FE_Code":"009F",
     "FC_Id":[4,5],
     "FC_Name":["ABCD","PQRS"],
     "FC_Value":[4,2],
     "OC_Id":7,
     "OC_Name":"Raj",
     "OC_Price":"$60",
     "CH_Id":7,
     "CH_Name":"Ken",
     "CH_Code":"IJK"
 }]

你可以看到FC_Id,FC_Name,FC_Value有2个元素,这3个参数实际上是相关的。 同样,所有与CO前面的参数都具有相同的模式。

我希望我的结果数组应该逐个考虑数组的每个元素。

因此,对于数组的第一个元素,它应该考虑FC_Id,FC_Name,FC_Value,CO_Id,CO_Name和CO_Value的逐个元素。

它实际上应该考虑子阵列和主阵列的所有元素。 因此我的结果应该是以下内容

    [{
    "IM_Id":1,
    "IM_Name":"Hello",
    "ItemNumber":2001,
    "FE_Id":2,
    "FE_Name":"Wall",
    "FE_Code":"XYZ",
    "FC_Id":2, //Here it took the first element
    "FC_Name":"ABC", // //Here it took the first element
    "FC_Value":9, ////Here it took the first element
    "OC_Id":6,
    "OC_Name":"Rai",
    "OC_Price":"$30",
    "CH_Id":4,
    "CH_Name":"Sen",
    "CH_Code":"LMN",
    "CO_Id":5,
    "CO_Name":"xyz",
    "CO_Value":"qqq"
},
{
    "IM_Id":1,
    "IM_Name":"Hello",
    "ItemNumber":2001,
    "FE_Id":2,
    "FE_Name":"Wall",
    "FE_Code":"XYZ",
    "FC_Id":3, //Here it took the second element
    "FC_Name":"PQR", //Here it took the second element
    "FC_Value":7,//Here it took the second element
    "OC_Id":6,
    "OC_Name":"Rai",
    "OC_Price":"$30",
    "CH_Id":4,
    "CH_Name":"Sen",
    "CH_Code":"LMN",
    "CO_Id":9,
    "CO_Name":"pqr",
    "CO_Value":"LMN"
},
 {
     "IM_Id":2,
     "IM_Name":"World",
     "ItemNumber":2002,
     "FE_Id":3,
     "FE_Name":"WallMart",
     "FE_Code":"009F",
     "FC_Id":4,
     "FC_Name":"ABCD",
     "FC_Value":4,
     "OC_Id":7,
     "OC_Name":"Raj",
     "OC_Price":"$60",
     "CH_Id":7,
     "CH_Name":"Ken",
     "CH_Code":"IJK",
     "CO_Id":"-",
    "CO_Name":"-",
    "CO_Value":"-"
 },
 {
     "IM_Id":2,
     "IM_Name":"World",
     "ItemNumber":2002,
     "FE_Id":3,
     "FE_Name":"WallMart",
     "FE_Code":"009F",
     "FC_Id":5,
     "FC_Name":"PQRS",
     "FC_Value":2,
     "OC_Id":7,
     "OC_Name":"Raj",
     "OC_Price":"$60",
     "CH_Id":7,
     "CH_Name":"Ken",
     "CH_Code":"IJK",
     "CO_Id":"-", // as there's no element here we are inputting a '-'
    "CO_Name":"-",
    "CO_Value":"-"
 }
 ]

另外,请注意,因为项目编号2002没有CO_值,所以放置" - "。 数组中还会有更多其他参数,我需要一些动态逻辑来创建结果数组

3 个答案:

答案 0 :(得分:0)

这样的事情:

  • 对于数据的每个元素
    • 在FC和CO之间找到至少一个ID列表(如果没有找到这样的列表,则构造一个单元素列表)
    • 迭代其长度,并用子条目替换相关条目
  • 展平结果



let data = [{"IM_Id":1,"IM_Name":"Hello","ItemNumber":2001,"FE_Id":2,"FE_Name":"Wall","FE_Code":"XYZ","FC_Id":[2,3],"FC_Name":["ABC","PQR"],"FC_Value":[9,7],"OC_Id":6,"OC_Name":"Rai","OC_Price":"$30","CH_Id":4,"CH_Name":"Sen","CH_Code":"LMN","CO_Id":[5,9],"CO_Name":["xyz","pqr"],"CO_Value":["qqq","LMN"]},{"IM_Id":2,"IM_Name":"World","ItemNumber":2002,"FE_Id":3,"FE_Name":"WallMart","FE_Code":"009F","FC_Id":[4,5],"FC_Name":["ABCD","PQRS"],"FC_Value":[4,2],"OC_Id":7,"OC_Name":"Raj","OC_Price":"$60","CH_Id":7,"CH_Name":"Ken","CH_Code":"IJK"}];
 
let result = [].concat(...data.map(r =>
  (Array.isArray(r.FC_Id) ? r.FC_Id :
    Array.isArray(r.CO_Id) ? r.CO_Id :
    [0]
  ).map((_, i) =>
    Object.assign({}, r, {
      FC_Id: r.FC_Id ? r.FC_Id[i] : "-",
      FC_Name: r.FC_Name ? r.FC_Name[i] : "-",
      FC_Value: r.FC_Value ? r.FC_Value[i] : "-",
      CO_Id: r.CO_Id ? r.CO_Id[i] : "-",
      CO_Name: r.CO_Name ? r.CO_Name[i] : "-",
      CO_Value: r.CO_Value ? r.CO_Value[i] : "-",
    })
  )
));

console.log(result);




答案 1 :(得分:0)

这是实现此目的的片段。如果需要将值作为数组处理更多属性,只需将它们添加到props数组:

let props = ["FC_Id", "FC_Name", "FC_Value", "CO_Id", "CO_Name", "CO_Value"]

示例代码段



let arr = [{
    "IM_Id": 1,
    "IM_Name": "Hello",
    "ItemNumber": 2001,
    "FE_Id": 2,
    "FE_Name": "Wall",
    "FE_Code": "XYZ",
    "FC_Id": [2, 3],
    "FC_Name": ["ABC", "PQR"],
    "FC_Value": [9, 7],
    "OC_Id": 6,
    "OC_Name": "Rai",
    "OC_Price": "$30",
    "CH_Id": 4,
    "CH_Name": "Sen",
    "CH_Code": "LMN",
    "CO_Id": [5, 9],
    "CO_Name": ["xyz", "pqr"],
    "CO_Value": ["qqq", "LMN"]
  },
  {
    "IM_Id": 2,
    "IM_Name": "World",
    "ItemNumber": 2002,
    "FE_Id": 3,
    "FE_Name": "WallMart",
    "FE_Code": "009F",
    "FC_Id": [4, 5],
    "FC_Name": ["ABCD", "PQRS"],
    "FC_Value": [4, 2],
    "OC_Id": 7,
    "OC_Name": "Raj",
    "OC_Price": "$60",
    "CH_Id": 7,
    "CH_Name": "Ken",
    "CH_Code": "IJK"
  }
]

function convertArray() {
  let result = [];
  let props = ["FC_Id", "FC_Name", "FC_Value", "CO_Id", "CO_Name", "CO_Value"]

  arr.forEach(function(obj) {
    // Assume `FC_Id` array length is the reference array length   
    obj["FC_Id"].forEach(function(id, $index) {
      // Create a clone of original object, so that we only have to override `props` defined above
      let objClone = JSON.parse(JSON.stringify(obj));
      
      // Override each prop value
      props.forEach(function(prop) {
        // Ensure original object property is an array with enough elements
        if (obj[prop] instanceof Array && obj[prop].length > $index) {
          objClone[prop] = obj[prop][$index];
        }
        else {
          // else simply use an hyphen as value
          objClone[prop] = "-";
        }  
      });
      
      // Push clone to result
      result.push(objClone);
    });
  });

  return result;
}

let newArray = convertArray();

console.log(JSON.stringify(newArray, null, 2));




答案 2 :(得分:-1)

从哪里创建此数组。如果您在JavaScript或webservice类中创建此数组。然后我们可以告诉你它的泛型类。还有一个小方法来转换你想要的输出数组中的类元素。

让我用JavaScript代码回答。

//我正在创建一个数组对象手册,您可以从源代码或服务器json中获取它。

var Arr=[];

var obj={};
Obj.Name="fc_name";
obj.Value="12";
Arr.push(obj);

var obj={};
Obj.Name="fc_value";
obj.Value="dieje";

Arr.push(obj);

同样推送数组中的所有元素。 然后你将得到一个名为value的对象数组。

Arr=[
{"Name":"fc_value",
"Value":""dieje"
},
...
});

现在使用下面的函数将这个对象数组转换成你想要的数组。

function Convert(arr)
{
var array=[];
var obj={};
Arr.forEach(value)
{
obj[value.Name]=value.Value;
}

array.push(obj); //这是针对单个对象,您可以应用循环来获取数组中的多个值。 }