2017-07-28 27 views
-1

將csv讀入javascript字典時,如何連接其他重複鍵的值?我已經看到了如何用bash,c#和perl做到這一點的答案,但是我一直無法找到Javascript的答案。這是我有:如何連接重複鍵的值

var subjects = {}; 

d3.csv("test.csv", function(data) { 
    for (var i = 0; i < data.length; i++) 
    { 
     subjects[data[i].Id] = data[i].VALUE;  
    } 
    console.log(subjects); 
}); 

這顯然寫在現有的鍵。相反,我希望密鑰是值的數組。該CSV基本上看起來像:

Id, VALUE 
id1, subject1 
id2, subject1 
id1, subject3 

我想輸出:

{"id1": ["subject1", "subject3"], "id2": ["subject1"]...} 

回答

2

只是檢查,如果你的輸出已經有鑰匙,如果是的話你添加新的價值的數組。否則你創建一個數組。

d3.csv("test.csv", function(data) { 
    var subjects = {}; 
    for (var i = 0; i < data.length; i++) 
    { 
     // Check if key already exists 
     if(subjects.hasOwnProperty(data[i].Id)){ 
      // push data to array 
      subjects[data[i].Id].push(data[i].VALUE); 
     }else{ 
      // create new key and array 
      subjects[data[i].Id] = [data[i].VALUE]; 
     } 
    } 
    console.log(subjects); 
}); 
0

試試這個for循環中:

typeof subjects[data[i].Id] == 'undefined' && (subjects[data[i].Id] = []);  
subjects[data[i].Id].push(data[i].VALUE);  
1

你可以把它變成一個數組,然後按內容分成數組 VAR科目= {};

d3.csv("test.csv", function(data) { 
    for (var i = 0; i < data.length; i++) 
    { 
     //first time we see this id, turn it into an array 
     if(typeof subjects[data[i].Id] != "object"){ 
     subjects[data[i].Id] = []; 
     } 
     //push content to the array 
     subjects[data[i].Id].push(data[i].VALUE); 
    } 
    console.log(subjects); 
}); 
0

,可以稍微減少代碼的足跡,如果您使用reduce

var out = data.reduce((p, c) => { 
    const id = c.Id; 
    p[id] = p[id] || []; 
    p[id].push(c.VALUE); 
    return p; 
}, {}); 

結果

{ 
    "id1": [ 
    "subject1", 
    "subject3" 
    ], 
    "id2": [ 
    "subject1" 
    ] 
} 

DEMO