2016-10-06 9 views
5

私はJSに慣れていません。データを整理するという概念は、特定の配列形式(これは私が処理しなければならないもの)からデータを取り出し、別の特定のJSON形式に出力しようとしています。配列をjsonリンクリストに変換するJS?

これは私が把握することはできません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} 
    ] 
}; 

を必要とJavaScriptで

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

これは近いですが、FIRSTソースが2回出現するこの例では機能しません: var data = [{"source": "Agricultural 'waste'"、 "target": "Bio-conversion"、 "value" "124.2729"}、 {"源": "農業廃棄物" "目標": "電力グリッド"、 "値": "0.597"} ]; –

+0

なぜですか?私はあなたが期待したものと全く同じ出力を持っていますか?何が問題ですか ? –

5

thusfarフィドルからの私のコードです:

[]アノテーションは、次のように配列を記述するために使用されます。

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

{}そのはあなたが互いに

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

この試しの内側にそれらを使用することができ、オブジェクト

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

を記述するために使用されています

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

ユースは私を使います、私はjsfiddleを更新しましたhttps://jsfiddle.net/9x4rdyy7/ –

+0

また、 –

関連する問題