Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/411.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript d3.csv将列值映射为对象中的键_Javascript_Csv_D3.js - Fatal编程技术网

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

Javascript d3.csv将列值映射为对象中的键,javascript,csv,d3.js,Javascript,Csv,D3.js,我正在处理拖放示例,希望从csv读取数据 我想将csv文件中返回的数据重新格式化为所需的格式。 在拖放场景中,被拖动的元素具有来自数组[3]的值,并被拖放到具有r1val(n)的元素上。当这些值匹配时,将发生一个事件。 我想找到一种方法,将第一列的值设置为键,如下面的对象所示 file.csv: col1,col2,col3,col4 r1val1,r1val2,r1val3,r1val4 r2val1,r2val2,r2val3,r2val4 .... 所需格式: var

我正在处理拖放示例,希望从csv读取数据

我想将csv文件中返回的数据重新格式化为所需的格式。 在拖放场景中,被拖动的元素具有来自数组[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"],
  ...
  } 
Object
  r1val1: Array[3]
  r2val1: Array[3]
  ...
__proto__: Object
所需格式的console.log:

  var colSet = {
  r1val1 : ["r1val2","r1val3","r1val4"],
  r2val1 : ["r2val2","r2val2","r2val2"],
  ...
  } 
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);
    }
}
这将生成一个而不是JavaScript对象,但应该适合您的情况(您仍然可以使用obj[key]访问对象之类的元素):

例如

在这一点上,我们都想得太多了,那么:

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);
});
更新。

d3.csv(“数据/语言.csv”,函数(错误,数据){
//重新格式化数据数组内容剥离“键”和“值”
var refData=data.map(函数(d){
var rObj={};
rObj[d.col1]=d.col3;
返回rObj;
});
//合并对象的函数
函数合并(目标,源){
/*合并两个(或多个)对象,
给予最后一个优先权*/
如果(目标类型!==“对象”){
目标={};
}   
对于(源中的var属性){
if(source.hasOwnProperty(property)){
var sourceProperty=源[属性];
if(typeof sourceProperty==='object'){
target[property]=util.merge(target[property],sourceProperty);
继续;
}        
目标[属性]=源属性;
}     
}    
for(var a=2,l=arguments.length;a
这段代码实际上生成了所需的对象。我对循环函数不太满意,因为它每行生成一个dwarfSet,而不是一个整体


非常欢迎您提出改进建议。

我认为这可以通过以下方法实现:

var obj = d3.nest()
  .key(function(d) { return d.r1val1; })
  .entries(data);

您可以使用jquery进行解析,但这可能不是最好的。@DotBeep-我已经在需要对象的地方包含了函数。Mark我已经使用了d3.map,到目前为止它还不起作用,我将重试。我的“更新”中的函数确实创建了正确的格式,但每行一次。我有一个对象合并函数,现在我必须弄清楚如何在循环中使用它。@EdDie,看看新的答案。我们都太花哨了:)