d3.csv将列值映射为对象中的键

时间:2015-08-07 16:38:50

标签: javascript csv d3.js

D3 Drag Drop Example

我正在处理一个想要从csv读取数据的拖放示例。

我想将我的csv文件中返回的数据重新格式化为所需的格式。 在拖放方案中,拖动的元素具有Array [3]中的值,并在具有r1val(n)的元素上被删除。当这些值匹配时发生事件。 我想找到一种方法将第一列的值设置为键,如下面的对象所示。

FILE.CSV:

  col1,col2,col3,col4
  r1val1,r1val2,r1val3,r1val4
  r2val1,r2val2,r2val3,r2val4
  ....

需要格式:

  var colSet = {
  r1val1 : ["r1val2","r1val3","r1val4"],
  r2val1 : ["r2val2","r2val2","r2val2"],
  ...
  } 

所需格式的console.log:

Object
  r1val1: Array[3]
  r2val1: Array[3]
  ...
__proto__: Object

我的目标是这个功能:

var DragDropManager = {
    dragged: null,
    droppable: null,
    draggedMatchesTarget: function() {
        if (!this.droppable) return false;
        return (colSet[this.droppable].indexOf(this.dragged) >= 0);
    }
}

3 个答案:

答案 0 :(得分:1)

这会生成d3.map而不是JavaScript对象,但应该适合您的情况(您仍然可以使用obj [key]访问对象等元素):

d3.csv('test.csv',function(error,rows){

    var obj = d3.map(rows, function(d){
      return d.col1;
    });
    obj.forEach(function(k,v){
      this[k] = [v.col2, v.col3, v.col4];
    });

    console.log(obj);
  });

示例here

此时,我们都在思考它,如何:

d3.csv('test.csv', function(error, rows) {
  var obj = {};
  rows.forEach(function(d){
    obj[d.col1] = [d.col2, d.col3, d.col4];
  });
  console.log(obj);
});

更新了example

答案 1 :(得分:0)

d3.csv("data/language.csv", function(error, data) {


//reformatting data array content stripping 'key' and 'value'


var refData = data.map(function(d){ 
var rObj = {};
rObj[d.col1] = d.col3;
return rObj;
});


// function that merges Objects
function merge(target, source) {      
    /* Merges two (or more) objects,
   giving the last one precedence */   
if ( typeof target !== 'object' ) {
    target = {};
}   
for (var property in source) {      
    if ( source.hasOwnProperty(property) ) {          
        var sourceProperty = source[ property ];         
        if ( typeof sourceProperty === 'object' ) {
            target[ property ] = util.merge( target[ property ],    sourceProperty );
            continue;
        }        
        target[ property ] = sourceProperty;          
    }     
}    
for (var a = 2, l = arguments.length; a < l; a++) {
    merge(target, arguments[a]);
}   
return target;
};


//loops through the refData creating dwarfSet
for (i = 0; i < refData.length; i++) {
var dwarfSet = merge(refData[0],refData[i]);
};

此代码实际上生成了所需的Object。我对循环函数并不完全满意,因为它每行产生一个dwarfSet,而不是整体。

非常欢迎提出改进建议。

答案 2 :(得分:0)

我认为这可以通过以下方式完成:

/node_modules/

http://learnjsdata.com/group_data.html