2017-02-17 3 views
-1

Ich habe ein Array von Objekten, die durch Ziehen von Daten aus einer CSV-Datei erstellt wird. Das Array sieht wie folgt aus (wenn gedruckt).Wie man ein Array von Objekten dynamisch erstellt?

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

Die Art, wie ich es erstellt habe, ist das folgende.

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) 
} 

Sagen wir jetzt, ich möchte jetzt ein anderes Array von Objekten mit denselben Datenwerten, aber verschiedenen Schlüsseln erstellen.

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

Ich habe verschiedene Möglichkeiten ausprobiert, ich habe es nicht geschafft. Zum Beispiel habe ich folgendes versucht.

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

Oder etwas mit einer ähnlichen Form. Ich habe ein leeres Array tableData = [] erstellt, in dem ich denke, dass das Erstellen der Elemente an Ort und Stelle den Zweck erfüllen würde, aber es wird nicht funktionieren. Gibt es das überhaupt, um das zu tun? Ich kann nicht einfach ein Objekt erstellen und alle Elemente aus dem ersten Array eins nach dem anderen kopieren, da die Anzahl der Elemente im ersten Array alles sein kann.

+1

Es ist immer noch ein bisschen unklar, was Sie fragen. Wie würde Ihr Ausgabeformat aussehen? –

+0

Sie haben vergessen, das Objekt zu initialisieren. Mit diesem Befehl werden Objekt und Wert gesetzt: tableData [i] = {key1: data [i] .value1} – Gilsdav

+0

Gibt es eine variable Anzahl von Schlüsseln in jedem Objekt? Mit anderen Worten, kann das zweite Objekt "value1:" 1200 "' und der dritte "value4:" 3 ", value5:" 22 "'? In welchem ​​Fall ordnen Sie von einem Schlüsselnamen auf den anderen zu? –

Antwort

1

Try this:

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

Das scheint gut zu funktionieren. @Den Isahac, ich weiß, du hast die gleiche Antwort gepostet, aber ich muss eine Antwort wählen. Danke beiden. – polaris

+0

Ich habe seine Antwort hochgestuft, damit er auch dafür Anerkennung bekommt. –

1
// declare array 
var tableData = []; 

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

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

können Sie nicht zu tableData[i]["key1"] zuweisen, bis Sie zunächst ein Objekt in tableData[i] setzen.

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

Sie können auch die Objektinitialisierung und Eigenschaftszuweisung kombinieren:

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

ein neues Objekt anlegen, dann ist es mit dem Table Array anhängt.

+1

Wir haben beide zur gleichen Zeit die gleiche Lösung veröffentlicht. Nun, das nenne ich den Gedankengang. :) –

1

Warum weisen Sie die Schlüssel nicht direkt aus Ihren CSV-Headern Ihrem Objekt zu? Auf diese Weise brauchen Sie nur einmal zu analysieren und benötigen keine zusätzlichen Schleifen und Arbeit ..

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));

Oder, wenn Sie unterschiedliche Header haben möchten Sie zuweisen:

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));

Verwandte Themen