2015-06-21 87 views
0

一個JavaScript數據對象(JSON符號)訪問javascript對象已經具有以下內容創建:在D3.js

"[ 
    {"range":"Shape","values":[{"idx":0,"val":"Random"},{"idx":1,"val":"Line"},{"idx":2,"val":"Square"},{"idx":3,"val":"Circle"},{"idx":4,"val":"Oval"},{"idx":5,"val":"Egg"}]}, 
    {"range":"Color","values":[{"idx":0,"val":"Red"},{"idx":1,"val":"Blue"},{"idx":2,"val":"Yellow"},{"idx":3,"val":"Green"},{"idx":4,"val":"Cyan"}]} 
]" 

在下一步驟的序值的索引在此被發現目的。該函數應該在「顏色」範圍內找到值「藍色」的索引。

因此函數應該具有元腳本形式

f("Color")("Blue")=1 

什麼是最優雅的形式創造D3和JavaScript的情況下這樣的功能?

+0

你如何定義「優雅」? –

+0

由於在直接訪問,可讀的代碼中,不涉及循環。我想用字典像訪問來解決這個問題。 –

+0

*「我想用像字典一樣解決這個問題」*然後你應該簡單地改變數據結構。如果您多次執行此類查找,則重構數據是有意義的。您可以在收到數據時動態執行此操作。 –

回答

2

根據您的使用情況,將數據結構轉換爲更適合直接訪問的不同結構可能有意義。例如。您可以將您的結構轉換爲

var data = { 
    Shape: ['Random', 'Line', ...], 
    // ... 
}; 

data['Shape'].indexOf('Line') // or data.Shape.indexOf('Line') 

訪問它,或者走得更遠,甚至一步到位,並轉換爲

var data = { 
    Shape: { 
     Random: 0, 
     Line: 1, 
     // ... 
    }, 
    // ... 
}; 

和訪問它與

data['Shape']['Line'] // or data.Shape.Line 

什麼是最好的解決方案ution取決於實際使用情況。


動態轉換結構非常簡單。這裏是將其轉換到第一建議的一個示例:

var newData = {}; 
data.forEach(function(item) { 
    newData[item.range] = 
     item.values.map(function(value) { return value.val; }); 
}); 

這也將減少冗餘(例如idx似乎與元素索引對應)。

0

這會適合你嗎?

var dataJson = '[ \ 
    {"range":"Shape","values":[{"idx":0,"val":"Random"},{"idx":1,"val":"Line"},{"idx":2,"val":"Square"},{"idx":3,"val":"Circle"},{"idx":4,"val":"Oval"},{"idx":5,"val":"Egg"}]},\ 
    {"range":"Color","values":[{"idx":0,"val":"Red"},{"idx":1,"val":"Blue"},{"idx":2,"val":"Yellow"},{"idx":3,"val":"Green"},{"idx":4,"val":"Cyan"}]}\ 
]'; 

var data = JSON.parse(dataJson); 

for (each in data){ 
    if ((data[each].range) === 'Color'){ 
     for (eachVal in data[each].values){ 
     if (data[each].values[eachVal].val === 'Blue'){ 
      alert(data[each].values[eachVal].idx); 
     } 
     } 
    } ; 
} 

here is the JSFiddle也適合你。

+0

謝謝,這確實有效。但這是最優雅的解決方案嗎?我猜想應該有一個更直接的價值,沒有雙循環。 –

+1

@MartijnvanderJagt:不是,你有兩個嵌套集合,你必須迭代一個或另一個。但是,如果您的環境支持它,則可以使用'Array#find'或'Array#findIndex'來代替內部循環:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find –

+0

感謝您的回覆。 –