2017-02-17 26 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

Кажется, что все нормально. @Den 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

Создание нового объекта, а затем добавляет его в массив tableData.

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