簡體   English   中英

將數組從一種格式轉換為另一種格式時出現問題

[英]Issue while converting array from one format to another

我有以下輸入數組(這是一個Javascript Object []數組響應):

[
    {index:1, headerCSV:"Name", dataFields: ["Name", "Id"]},
    {index:2, headerCSV:"Id", dataFields: ["Test", "Test 1"]},
    {index:3, headerCSV:"fname", dataFields: ["Test", "Test 1"]},
    {index:4, headerCSV:"lname", dataFields: []},
]

我正在嘗試將其轉換為以下數組:

[
    {"header" : 1, "field" :"Name"},
    {"header" : 1, "field" :"Id"},
    {"header" : 2, "field" :"Test"},
    {"header" : 2, "field" :"Test 1"},
    {"header" : 3, "field" :"Test"},
    {"header" : 3, "field" :"Test 1"}
]

在結果數組中,我將需要在header中輸入輸入數組的index ,在field我需要使用輸入數組的dataFields數組的數組進行構造。 我嘗試使用以下代碼:

var CSVHeadersAndFields = /* The input array */;
var headerFieldMappingJSON = [];
for(var i=0; i<CSVHeadersAndFields.length;i++) {
    headerFieldMappingJSON[i] = {};
    var selectedFields = CSVHeadersAndFields[i].dataFields;
    for(var j=0; j<selectedFields.length;j++) {
        headerFieldMappingJSON[i].header = CSVHeadersAndFields[i].index;
        headerFieldMappingJSON[i].field = selectedFields[j];
    }
}

但是我得到了以下結果:

[
    {"header":1,"field":"Name"},
    {"header":2,"field":"Test"},
    {"header":3,"field":"Test"},
    {}
]

我懷疑表單for循環的第一個迭代值被第二個迭代替換,並且我還需要避免從輸入數組的空dataFields數組構造輸出數組映射。

如何制作正確的算法來轉換數組?

為結果數組創建一個單獨的迭代器索引。 或者只是推送到結果數組,而不是按索引添加值:

var CSVHeadersAndFields = /* The array from question */;
var headerFieldMappingJSON = [];
for(var i = 0; i < CSVHeadersAndFields.length; i++) {
    var selectedFields = CSVHeadersAndFields[i].dataFields;
    for(var j = 0; j < selectedFields.length; j++) {
        headerFieldMappingJSON.push({
            header: CSVHeadersAndFields[i].index,
            field: selectedFields[j]
        });
    }
}

相同的示例,但更干凈:

var input = /* The array from question */;
var output = [];

input.forEach(function (csvRow) {
    csvRow.dataFields.forEach(function (field) {
        output.push({
            header: csvRow.index,
            field: field
        });
    });
});

下面的代碼將為每個dataField提供一個結果對象,並將CSVHeadersAndFieldsindex屬性用作它們的header屬性。

const result = CSVHeadersAndFields.map(item => item.dataFields.map(field => { return { header: item.index, field } }) );

您可以嘗試以下方法:

邏輯:

  • 循環分析數據,並基於解析邏輯將數據推送到數組中。
  • 在每次迭代中,您可以再次循環obj.dataFields並為每個字段創建對象。
  • 然后,您可以將此輸出數組合並到原始輸出列表。

 var data = [ {index:1, headerCSV:"Name", dataFields: ["Name", "Id"] }, {index:2, headerCSV:"Id", dataFields: ["Test", "Test 1"] }, {index:3, headerCSV:"fname", dataFields: ["Test", "Test 1"] }, {index:4, headerCSV:"lname", dataFields: []} ]; var output = data.reduce((acc, obj) => { const header = obj.index; return acc.concat( obj.dataFields.map((field) => ({ header, field}) )) }, []); console.log(output) 

這是更簡單的代碼:

    var CSVHeadersAndFields = [ {index:1, headerCSV:"Name", dataFields: ["Name","Id"]},
     {index:2, headerCSV:"Id", dataFields:["Test","Test 1"]},{index:3, headerCSV:"fname", dataFields:["Test","Test 1"]}, {index:4, headerCSV:"lname", dataFields:[]};

    var headerFieldMappingJSON  = [];

   for(var CSVHeadersAndField of CSVHeadersAndFields ) {
       for(var dataFieldVal of CSVHeadersAndField['dataFields']){
         headerFieldMappingJSON.push({'header': CSVHeadersAndField['index'], 'field': dataFieldVal })
       }
   }

輸出:

[
  {
    "header": 1,
    "field": "Name"
  },
  {
    "header": 1,
    "field": "Id"
  },
  {
    "header": 2,
    "field": "Test"
  },
  {
    "header": 2,
    "field": "Test 1"
  },
  {
    "header": 3,
    "field": "Test"
  },
  {
    "header": 3,
    "field": "Test 1"
  }
]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM