2017-07-28 71 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