2016-08-07 36 views
0

我有一個表示像這樣的表數組:將數組轉換爲對象來創建報表的JavaScript

table = [['john', 'male', 24, '12/12/12'], ['jane', 'female', 24, 12/12/12]] 

我希望讓用戶選擇他們想要的列,所以後來他們可以做出pdf報告與他們選擇的列,我認爲這樣的對象是獲得這些數據的最佳方式,我當然可能錯了哈哈。

比方說,用戶希望在報告標題中的以下數據:姓名,年齡,日期,我想是這樣的對象:

userHeader = { name: 'John', age: 24, date: '12/12/12'} 

所以我可以做下一份報告:

  Report #1234 
|-------------------------------| 
|Name: John Date: 24/12/12 | <-Header 
|Age: 24      | 
|-------------------------------| 
|some data      | <--Body 
| ....       | 
|-------------------------------| 

我有用戶想要的是將其存儲索引,例如,如果用戶想要的列1和2中的列的陣列,該陣列是這樣的:

var userColumns = [1,2] 

我該如何解決這個問題?你會怎麼做?

編輯:我把錯誤的表,。這是表:

table1 = [['john', 'male', 24, '12/12/12', 1], ['john', 'male', 24, 01/05/12, 1]] 

table2 = [['john', 'male', 24, '12/07/12', 2], ['john', 'male', 24, 05/05/12, 2]] 

爲了得到一些方面,我有一個CSV多列和行的文件,每一行都有不同的codeItem,這codeItem可以在多個行或不重複,我要做的就是創建多個具有相同代碼報告的表,例如,如果CSV數據有10行,其中5個codeItem爲1,另外5個codeItem爲2,則創建2個表,其中一個包含所有具有codeItem 1的行和另一個codeItem 2,然後我會爲每個codeItem,在這種情況下2個報告,所以每個表都有一些行在某些列上具有相同的數據報告。 用戶欄是用戶選擇出現在報告中哪些列,我有標題列的排列:

var headers = ['name', 'sex', 'age', 'date', 'codeReport'] 

我要做的就是頭陣的userColumns對符合指標,可以說,用戶想要的姓名和年齡頭,用戶報頭是:

userHeader = [0,2]

我知道這聽起來很混亂,它確實是。

+0

什麼是列?爲什麼你忽略第二個數組? – Oriol

+1

你能告訴我們你有什麼輸入('table')和你想寫什麼代碼(比如'extract(table [0])')以及那個代碼做了什麼或者返回什麼(例如'extract(table [0])== {姓名:'約翰',年齡:24,日期:'12/12/12'}')。如果這一切都是正確的,那很好,但這會更容易理解。無論哪種方式,我真的不明白'userColumns'是什麼? – Whothehellisthat

回答

0

首先,如果你想使用對象從一個給定的陣列中存儲數據,你需要我例程轉換它們。因此,我總是創建一個空對象o = {},並用o["prop"] = value填充此對象。與o.prop = value相同。

let headers = ['name', 'sex', 'age', 'date', 'codeReport']; 
function createObjectFromArray(array, indexes) 
{ 
    let result = {}; 
    for(let index of indexes) 
    { 
     result[headers[index]] = array[index]; 
    } 
    return result; 
} 
let recordObject = createObjectFromArray(['john', 'male', 24, '12/12/12', 1], [1, 2]); 
//Object {sex: "male", age: 24} 

與ECMAScript 6類地圖的幫助下,就可以將對象鏈接到任何數據。或者你可以使用IndexedDB

let reportDataBase = new Map(); 
reportDataBase.set(recordObject, "somedata"); 
reportDataBase.get(recordObject); // "somedata" 

如果你想通過所有表迭代(表1有代碼項目1,表2有代碼項目2,...),你需要一個對象,它是迭代。我推薦一個數組。

let tables = [table1, table2]; 
let selectedColumns = [1, 2]; 
for(var report = 0; report != tables.length; report++) 
{ 
    console.log("report : " + (report + 1)); 
    tables[report].forEach(function(item) 
    { 
     console.log(createObjectFromArray(item, selectedColumns)); 
    }); 
} 

我認爲更好的方式來存儲在內存中的數據,並生成不同的報告,是使用一種數據結構是這樣的:

var reports = [ 
    [['john', 24, "somedata1"], ['lara', 22, "somedata2"]], 
    [['mark', 21, "somedata3"], ['eve', 25, "somedata4"]] 
]; 

但它是一個壞主意,存儲所有的個人數據在一個開放的瀏覽器。要顯示一條記錄需要很多資源,問題是:想要他的數據是公開的人嗎?

一個解決方案是:前端< - > node.js

0

你只需要表頭的用戶數據的陣列狀

ReportHeaderAssociation = { 
"0":Name", 
"1":Age", 
.... 

} 

所以,當你得到了用戶所需的列關聯(這裏[1,2]),你可以從關聯對象和值稱號通過訪問數組元素。

一樣,userdata[1]會給你這是性別數據的第二個元素。同樣所有元素。

總之:與相對單一的對象將做的工作沒有必要長時間運行的循環轉換數組對象。

0

您需要爲列名的映射,例如與哪些列你想同樣的指標的數據和過濾器。

該地圖後,並降低是你的朋友;)

var table = [ 
 
    ['John', 'male', 24, '12/12/12'], 
 
    ['Jane', 'female', 22, '11/11/11'] 
 
]; 
 

 
var columnMapping = ['name', 'gender', 'age', 'date']; 
 

 
var getData = function(data, columnNames, columnFilter) { 
 
    return data.map(function(item) { 
 
    return item.reduce(function(obj, item, idx) { 
 
     if (columnFilter.indexOf(idx) > -1) { 
 
     obj[columnNames[idx]] = item; 
 
     } 
 
     return obj; 
 
    }, {}); 
 
    }); 
 
} 
 

 
// age and gender 
 
console.log(getData(table, columnMapping, [1, 2])); 
 

 
// name and date 
 
console.log(getData(table, columnMapping, [0, 3])); 
 

 
// name, age and date 
 
console.log(getData(table, columnMapping, [0, 2, 3])); 
 

 
// name, age and date only if name is John 
 
console.log(getData(table, columnMapping, [0, 2, 3]).filter(function(item) { 
 
    return item.name === 'John'; 
 
}));

相關問題