2017-02-17 53 views
-1

我有一個通過從csv文件中提取數據創建的對象數組。該數組看起來像以下(打印時)。如何動態創建一個對象數組?

Array[4] 
0:Object 
    value1:"200" 
    value2:"95" 
    value3:"6395" 
    value4:"2" 
1:Object 
2:Object 
3:Object 

我創建它的方式如下。

var strCSV = e.target.result; 
var arrCSV = strCSV.match(/[\w .]+(?=,?)/g); 
var noOfCols = 4; 

// To ignore the first row which is header 
var hdrRow = arrCSV.splice(0, noOfCols); 

var data = []; 
while (arrCSV.length > 0) { 
    var obj = {}; 
    // extract remaining rows one by one 
    var row = arrCSV.splice(0, noOfCols) 
    for (var i = 0; i < row.length; i++) { 
     obj[hdrRow[i]] = row[i].trim(); 
    } 
    // push row to an array 
    data.push(obj) 
} 

所以我們假設現在我想創建另一個具有相同數據值但不同鍵的對象數組。

var tableData = [ 
     {key1: "", key2: "", key3: "", key4: ""}]; 

我試過不同的方法來做我一直沒能做到。例如,我嘗試了以下。

for(var i=0; i<data.length; i++){ 
    console.log(i); 
    tableData[i]["key1"] = data[i].value1; 
} 

或類似形式的東西。我創建了一個空的數組tableData = [],認爲在現場創建元素會做到這一點,但它不會。無論如何要做到這一點?我不能只是創建一個對象,並從第一個數組中逐個拷貝所有元素,因爲第一個數組中的元素數量可能是任何東西。

+1

它仍然有點不清楚你在問什麼。你的輸出格式是什麼樣子? –

+0

你忘記了初始化對象。使用這個將初始化對象並設置值:tableData [i] = {key1:data [i] .value1} – Gilsdav

+0

每個對象中是否有可變數量的鍵?換句話說,第二個對象可以具有「value1:」1200「'和第三個'value4:」3「,value5:」22「'?在這種情況下,您如何從一個關鍵名稱映射到另一個關鍵名稱? –

回答

1

試試這個:

for(var i=0; i<data.length; i++){ 
    console.log(i); 
    var obj = { "key1": data[i].value1, "key2": data[i].value2}; 
    tableData.push(obj); 
} 
+1

這似乎工作正常。 @丹Isahac,我知道你發佈了相同的答案,但我必須選擇一個答案。謝謝。 – polaris

+0

我提高了他的回答,所以他也可以得到好評。 –

1
// declare array 
var tableData = []; 

for (...) { 
    // create new object 
    var obj = { key1: "", key2: "" }; 

    // add obj to array 
    tableData.push(obj); 
} 
1

不能分配給tableData[i]["key1"],直到你第一次將物體放入tableData[i]

for(var i=0; i<data.length; i++){ 
    console.log(i); 
    tableData[i] = {}; 
    tableData[i]["key1"] = data[i].value1; 
} 

您還可以結合對象初始化和財產分配:

for(var i=0; i<data.length; i++){ 
    console.log(i); 
    tableData[i] = {key1: data[i].value1}; 
} 
2

創建一個新的對象,然後將其附加到資料表陣列。

for(var i=0; i<data.length; i++){ 
    console.log(i); 
    var newData = { "key1" : data[i].value1 }; 
    tableData.push(newData); 
} 
+1

我們幾乎同時發佈了相同的解決方案。現在這就是我所說的思想對齊。 :) –

1

爲什麼不直接將密鑰從您的csv頭分配給您的對象?這樣,你只需要一次解析它,並不需要額外的循環和工作..

var csv = `foo,bar,baz\na,b,c\nd,e,f\ng,h,i`; 
 

 
function parseCsv(str) { 
 
    let split = str.split("\n"); 
 
    let header = split.shift().split(','); 
 
    let res = []; 
 

 
    split.forEach((line) => { 
 
    let o = {}; 
 
    line.split(',').forEach((el, i) => { 
 
     o[header[i]] = el; 
 
    }) 
 
    res.push(o); 
 
    }); 
 
    return res; 
 
} 
 

 
console.log(parseCsv(csv));

或者,如果你有不同的頭,你要分配:

let csv = `foo,bar,baz\na,b,c\nd,e,f\ng,h,i`; 
 
let header = ["head1", "head2", "head3"]; 
 
function parseCsv(str) { 
 
    let split = str.split("\n"); 
 
    split.shift(); 
 
    let res = []; 
 

 
    split.forEach((line) => { 
 
    let o = {}; 
 
    line.split(',').forEach((el, i) => { 
 
     o[header[i]] = el; 
 
    }) 
 
    res.push(o); 
 
    }); 
 
    return res; 
 
} 
 

 
console.log(parseCsv(csv));