2016-10-06 145 views
5

我對JS很陌生,組織數據的概念稍微有些困難,試圖從特定的數組格式中獲取數據(因爲這是我必須處理的)並將其輸出到另一個特定的JSON格式。JS將數組轉換爲json鏈表?

這是將數據傳遞到D3桑基模塊 https://github.com/d3/d3-plugins/blob/master/sankey/sankey.js

我無法弄清楚是怎麼節點的索引添加到鏈接,而不是名稱。

真的,我完全失去了它! 我做了這裏提琴: https://jsfiddle.net/adamdavi3s/kw3jtzx4/

下面是數據的一個例子和輸出所需

var data= [ 
    {"source":"Agricultural 'waste'","target":"Bio-conversion","value":"124.2729"}, 
    {"source":"Bio-conversion","target":"Electricity grid","value":"0.597"}, 
    {"source":"Bio-conversion","target":"Losses","value":"26.862"}, 
    {"source":"Bio-conversion","target":"Liquid","value":"280.322"}, 
    {"source":"Losses","target":"Liquid","value":"280.322"} 
]; 


var output= { 
    "nodes":[ 
     {"name":"Agricultural 'waste'"}, 
     {"name":"Bio-conversion"}, 
     {"name":"Electricity grid"}, 
     {"name":"Losses"}, 
     {"name":"Liquid"} 
    ], 
    "links":[ 
     {"source":0,"target":1,"value":124.729}, 
     {"source":1,"target":2,"value":0.597}, 
     {"source":1,"target":3,"value":26.862}, 
     {"source":1,"target":4,"value":280.322}, 
     {"source":3,"target":4,"value":280.322} 
    ] 
}; 

下面是從小提琴我的代碼thusfar

var data=[{"source":"Agricultural 'waste'","target":"Bio-conversion","value":"124.2729"}, 
{"source":"Bio-conversion","target":"Electricity grid","value":"0.597"}, 
{"source":"Bio-conversion","target":"Losses","value":"26.862"}, 
{"source":"Bio-conversion","target":"Liquid","value":"280.322"}, 
{"source":"Losses","target":"Liquid","value":"280.322"} 
]; 

var sourceArray=[]; 

for (var i=0; i <data.length; i++)  { 
var node= {"name":data[i].source}; 
var found = jQuery.inArray(node, sourceArray); 
if (found < 0) { 
     // Element was not found, add it. 
    sourceArray.push(node); 
} 

} 
console.log(sourceArray); 

回答

4

Array.reduce()非常適合這種使用情況;)

看看。

var data=[{"source":"Agricultural 'waste'","target":"Bio-conversion","value":"124.2729"}, 
 
{"source":"Bio-conversion","target":"Electricity grid","value":"0.597"}, 
 
{"source":"Bio-conversion","target":"Losses","value":"26.862"}, 
 
{"source":"Bio-conversion","target":"Liquid","value":"280.322"}, 
 
{"source":"Losses","target":"Liquid","value":"280.322"} 
 
]; 
 

 

 
var output = data.reduce(function(result, item){ 
 
    for(key in search = ['source','target']) { 
 
    var value = item[search[key]]; 
 
    
 
    if(! result.index.hasOwnProperty(value)){ 
 
     result.index[value] = Object.keys(result.index).length; 
 
     result.nodes.push({name: value}); 
 
    } 
 
    } 
 
    
 
    result.links.push({ 
 
    source: result.index[item.source], 
 
    target: result.index[item.target], 
 
    value: Number(item.value) 
 
    }); 
 
    
 
    return result; 
 
}, {nodes: [], links: [], index: {}}); 
 

 
delete output.index; 
 
console.log(output);

+0

這看起來真的很好,謝謝,我會嘗試和消化到底是做什麼! –

+0

如此接近,但在第一個來源出現兩次的示例中不起作用: var data = [{「source」:「Agricultural'waste'」,「target」:「Bio-conversion」,「value」: 「124.2729」}, {「source」:「農業廢棄物」,「目標」:「電網」,「價值」:「0.597」} ]; –

+0

爲什麼?我有你期望的完全相同的輸出?問題是什麼 ? –

5

在javascript中:

[]註釋用於描述陣列,如:

var names=["John","Lisa"] 

{}它被用來描述對象

var person = {"name" : "John", "age" : 23} 

你可以用它們在彼此內部

var people=[{"name" : "John", "age" : 23},{"name" : "Lisa", "age" : 44}] 

試試這個:

var data=[{"source":"Agricultural 'waste'","target":"Bio-conversion","value":"124.2729"}, 
 
{"source":"Bio-conversion","target":"Electricity grid","value":"0.597"}, 
 
{"source":"Bio-conversion","target":"Losses","value":"26.862"}, 
 
{"source":"Bio-conversion","target":"Liquid","value":"280.322"}, 
 
{"source":"Losses","target":"Liquid","value":"280.322"} 
 
]; 
 

 
var sourceArray=[]; 
 
var linkArray=[]; 
 

 
for (var i=0; i <data.length; i++) \t \t { 
 
var node= {"name":data[i].source,}; 
 
var link= { 
 
"source":i, 
 
"target":data[i].target, 
 
"value":data[i].value, 
 
}; 
 
var found = jQuery.inArray(node, sourceArray); 
 
if (found >= 0) { 
 
    // Element was found, remove it. 
 
    sourceArray.splice(found, 1); 
 
    linkArray.splice(found, 1); 
 
} else { 
 
    // Element was not found, add it. 
 
    sourceArray.push(node); 
 
    linkArray.push(link); 
 
} 
 

 
} 
 
finalArray={"nodes": sourceArray,"links": linkArray} 
 
console.log(finalArray);

https://jsfiddle.net/9x4rdyy7/

+0

我只是用jQuery.inArray嘗試自己,但得到相同的結果,你,它推動的項目,即使他們存在。這和恐怕你的鏈接數組只包含字符串,而不是節點中的項目的索引 –

+0

Juse使用我,我更新了jsfiddle https://jsfiddle.net/9x4rdyy7/ –

+0

你也可以使用我的目標? –