2016-11-13 10 views
1

私はjsonから価値を得ようといくつかの問題を抱えています。まず、私はjsonの配列を持ち、それぞれが名前(atributo)、類似性(これについては忘れています)、そして最後にキーと値を持つvaloresという名前の配列(chave = key/valor = value)を持っています。正しい値を得るためのより良い方法

私は多くのケースがあり、それぞれのケースにはこの例のような値があります。私が望むのは、私のケースの鍵を使ってバロアレスの価値を取ることです。

私は2つのforを使用しています.1つは右のatributoを探し、もう1つは正しい鍵を見つけることです。これを行うのが簡単な方法はありますか?必要ならば、私はこのjsonスキーマを改造することができます。

マイ配列:

[ 
    { 
    "atributo": "date", 
    "similaridade": "Sim", 
    "valores": [ 
     {"chave": "Desconhecido", "valor": "?"}, 
     {"chave": "Abril", "valor": "0"}, 
     {"chave": "Maio", "valor": "1"}, 
     {"chave": "Junho", "valor": "2"}, 
     {"chave": "Julho", "valor": "3"}, 
     {"chave": "Agosto", "valor": "4"}, 
     {"chave": "Setembro", "valor": "5"}, 
     {"chave": "Outubro", "valor": "6"} 
    ] 
    }, 
    { 
    "atributo": "plantStand", 
    "similaridade": "Não", 
    "valores": [ 
     {"chave": "Desconhecido", "valor": "?"}, 
     {"chave": "Normal", "valor": "0"}, 
     {"chave": "lt-normal", "valor": "1"} 
    ] 
    }, 
    { 
    "atributo": "precip", 
    "similaridade": "Não", 
    "valores": [ 
     {"chave": "Desconhecido", "valor": "?"}, 
     {"chave": "lt-normal", "valor": "0"}, 
     {"chave": "Normal", "valor": "1"}, 
     {"chave": "gt-normal", "valor": "2"} 
    ] 
    }, 
    { 
    "atributo": "temp", 
    "similaridade": "Não", 
    "valores": [ 
     {"chave": "Desconhecido", "valor": "?"}, 
     {"chave": "lt-norm", "valor": "0"}, 
     {"chave": "norm", "valor": "1"}, 
     {"chave": "gt-norm", "valor": "2"} 
    ] 
    }, 
    { 
    "atributo": "hail", 
    "similaridade": "Não", 
    "valores": [ 
     {"chave": "Desconhecido", "valor": "?"}, 
     {"chave": "Yes", "valor": "0"}, 
     {"chave": "No", "valor": "1"} 
    ] 
    }, 
    { 
    "atributo": "cropHist", 
    "similaridade": "Sim", 
    "valores": [ 
     {"chave": "Desconhecido", "valor": "?"}, 
     {"chave": "diff-1st-yr", "valor": "0"}, 
     {"chave": "same-1st-yr", "valor": "1"}, 
     {"chave": "same-lst-two-yrs", "valor": "2"}, 
     {"chave": "same-lst-sev-yrs", "valor": "3"} 
    ] 
    }, 
    { 
    "atributo": "areaDamaged", 
    "similaridade": "Sim", 
    "valores": [ 
     {"chave": "Desconhecido", "valor": "?"}, 
     {"chave": "scattered", "valor": "0"}, 
     {"chave": "low-areas", "valor": "1"}, 
     {"chave": "upper-areas", "valor": "2"}, 
     {"chave": "whole-field", "valor": "3"} 
    ] 
    }, 
    { 
    "atributo": "severity", 
    "similaridade": "Sim", 
    "valores": [ 
     {"chave": "Desconhecido", "valor": "?"}, 
     {"chave": "Minor", "valor": "0"}, 
     {"chave": "pot-severe", "valor": "1"}, 
     {"chave": "severe", "valor": "2"} 
    ] 
    }, 
    { 
    "atributo": "seedTmt", 
    "similaridade": "Não", 
    "valores": [ 
     {"chave": "Desconhecido", "valor": "?"}, 
     {"chave": "none", "valor": "0"}, 
     {"chave": "fungicida", "valor": "1"}, 
     {"chave": "Outros", "valor": "2"} 
    ] 
    }, 
    { 
    "atributo": "germination", 
    "similaridade": "Sim", 
    "valores": [ 
     {"chave": "Desconhecido", "valor": "?"}, 
     {"chave": "90-100%", "valor": "0"}, 
     {"chave": "80-89%", "valor": "1"}, 
     {"chave": "lt-80%", "valor": "2"} 
    ] 
    }, 
    { 
    "atributo": "plantGrowth", 
    "similaridade": "Não", 
    "valores": [ 
     {"chave": "Desconhecido", "valor": "?"}, 
     {"chave": "Norm", "valor": "0"}, 
     {"chave": "Abnorm", "valor": "1"} 
    ] 
    }, 
    { 
    "atributo": "leaves", 
    "similaridade": "Não", 
    "valores": [ 
     {"chave": "Norm", "valor": "0"}, 
     {"chave": "Abnorm", "valor": "1"} 
    ] 
    }, 
    { 
    "atributo": "leafspotsHalo", 
    "similaridade": "Não", 
    "valores": [ 
     {"chave": "Desconhecido", "valor": "?"}, 
     {"chave": "absent", "valor": "0"}, 
     {"chave": "yellow-halos", "valor": "1"}, 
     {"chave": "no-yellow-halos", "valor": "2"} 
    ] 
    }, 
    { 
    "atributo": "leafspotsMarg", 
    "similaridade": "Não", 
    "valores": [ 
     {"chave": "Desconhecido", "valor": "?"}, 
     {"chave": "w-s-marg", "valor": "0"}, 
     {"chave": "no-w-s-marg", "valor": "1"}, 
     {"chave": "dna", "valor": "2"} 
    ] 
    }, 
    { 
    "atributo": "leafspotSize", 
    "similaridade": "Não", 
    "valores": [ 
     {"chave": "Desconhecido", "valor": "?"}, 
     {"chave": "lt-1/8", "valor": "0"}, 
     {"chave": "gt-1/8", "valor": "1"}, 
     {"chave": "dna", "valor": "2"} 
    ] 
    }, 
    { 
    "atributo": "leafShread", 
    "similaridade": "Não", 
    "valores": [ 
     {"chave": "Desconhecido", "valor": "?"}, 
     {"chave": "absent", "valor": "0"}, 
     {"chave": "Present", "valor": "1"} 
    ] 
    }, 
    { 
    "atributo": "leafMalf", 
    "similaridade": "Não", 
    "valores": [ 
     {"chave": "Desconhecido", "valor": "?"}, 
     {"chave": "Absent", "valor": "0"}, 
     {"chave": "Present", "valor": "1"} 
    ] 
    }, 
    { 
    "atributo": "leafMild", 
    "similaridade": "Não", 
    "valores": [ 
     {"chave": "Desconhecido", "valor": "?"}, 
     {"chave": "Absent", "valor": "0"}, 
     {"chave": "Upper-surf", "valor": "1"}, 
     {"chave": "Lower-surf", "valor": "2"} 
    ] 
    }, 
    { 
    "atributo": "stem", 
    "similaridade": "Não", 
    "valores": [ 
     {"chave": "Desconhecido", "valor": "?"}, 
     {"chave": "Norm", "valor": "0"}, 
     {"chave": "Abnorm", "valor": "1"} 
    ] 
    }, 
    { 
    "atributo": "lodging", 
    "similaridade": "Sim", 
    "valores": [ 
     {"chave": "Desconhecido", "valor": "?"}, 
     {"chave": "Yes", "valor": "0"}, 
     {"chave": "No", "valor": "1"} 
    ] 
    }, 
    { 
    "atributo": "stemCankers", 
    "similaridade": "Sim", 
    "valores": [ 
     {"chave": "Desconhecido", "valor": "?"}, 
     {"chave": "Absent", "valor": "0"}, 
     {"chave": "below-soil", "valor": "1"}, 
     {"chave": "Above-soil", "valor": "2"}, 
     {"chave": "Above-sec-nde", "valor": "3"} 
    ] 
    }, 
    { 
    "atributo": "cankerLesion", 
    "similaridade": "Não", 
    "valores": [ 
     {"chave": "Desconhecido", "valor": "?"}, 
     {"chave": "dna", "valor": "0"}, 
     {"chave": "Brown", "valor": "1"}, 
     {"chave": "dk-brown-blk", "valor": "2"}, 
     {"chave": "tan", "valor": "3"} 
    ] 
    }, 
    { 
    "atributo": "fruitingBodies", 
    "similaridade": "Não", 
    "valores": [ 
     {"chave": "Desconhecido", "valor": "?"}, 
     {"chave": "Absent", "valor": "0"}, 
     {"chave": "Present", "valor": "1"} 
    ] 
    }, 
    { 
    "atributo": "externalDecay", 
    "similaridade": "Não", 
    "valores": [ 
     {"chave": "Desconhecido", "valor": "?"}, 
     {"chave": "Absent", "valor": "0"}, 
     {"chave": "firm-and-dry", "valor": "1"}, 
     {"chave": "watery", "valor": "2"} 
    ] 
    }, 
    { 
    "atributo": "mycelium", 
    "similaridade": "Não", 
    "valores": [ 
     {"chave": "Desconhecido", "valor": "?"}, 
     {"chave": "Absent", "valor": "0"}, 
     {"chave": "Present", "valor": "1"} 
    ] 
    }, 
    { 
    "atributo": "intDiscolor", 
    "similaridade": "Não", 
    "valores": [ 
     {"chave": "Desconhecido", "valor": "?"}, 
     {"chave": "None", "valor": "0"}, 
     {"chave": "Brown", "valor": "1"}, 
     {"chave": "Black", "valor": "2"} 
    ] 
    }, 
    { 
    "atributo": "sclerotia", 
    "similaridade": "Não", 
    "valores": [ 
     {"chave": "Desconhecido", "valor": "?"}, 
     {"chave": "Absent", "valor": "0"}, 
     {"chave": "Present", "valor": "1"} 
    ] 
    }, 
    { 
    "atributo": "fruitPods", 
    "similaridade": "Não", 
    "valores": [ 
     {"chave": "Desconhecido", "valor": "?"}, 
     {"chave": "Norm", "valor": "0"}, 
     {"chave": "Diseased", "valor": "1"}, 
     {"chave": "few-present", "valor": "2"}, 
     {"chave": "dna", "valor": "3"} 
    ] 
    }, 
    { 
    "atributo": "fruitSpots", 
    "similaridade": "Não", 
    "valores": [ 
     {"chave": "Desconhecido", "valor": "?"}, 
     {"chave": "Absent", "valor": "0"}, 
     {"chave": "Colored", "valor": "1"}, 
     {"chave": "Brown-w/blk-specks", "valor": "2"}, 
     {"chave": "Distort", "valor": "3"}, 
     {"chave": "dna", "valor": "4"} 
    ] 
    }, 
    { 
    "atributo": "seed", 
    "similaridade": "Não", 
    "valores": [ 
     {"chave": "Desconhecido", "valor": "?"}, 
     {"chave": "Norm", "valor": "0"}, 
     {"chave": "Abnorm", "valor": "1"} 
    ] 
    }, 
    { 
    "atributo": "moldGrowth", 
    "similaridade": "Não", 
    "valores": [ 
     {"chave": "Desconhecido", "valor": "?"}, 
     {"chave": "Absent", "valor": "0"}, 
     {"chave": "Present", "valor": "1"} 
    ] 
    }, 
    { 
    "atributo": "seedDiscolor", 
    "similaridade": "Não", 
    "valores": [ 
     {"chave": "Desconhecido", "valor": "?"}, 
     {"chave": "Absent", "valor": "0"}, 
     {"chave": "Present", "valor": "1"} 
    ] 
    }, 
    { 
    "atributo": "seedSize", 
    "similaridade": "Não", 
    "valores": [ 
     {"chave": "Desconhecido", "valor": "?"}, 
     {"chave": "Norm", "valor": "0"}, 
     {"chave": "lt-norm", "valor": "1"} 
    ] 
    }, 
    { 
    "atributo": "shriveling", 
    "similaridade": "Não", 
    "valores": [ 
     {"chave": "Desconhecido", "valor": "?"}, 
     {"chave": "Absent", "valor": "0"}, 
     {"chave": "Present", "valor": "1"} 
    ] 
    }, 
    { 
    "atributo": "roots", 
    "similaridade": "Não", 
    "valores": [ 
     {"chave": "Desconhecido", "valor": "?"}, 
     {"chave": "Norm", "valor": "0"}, 
     {"chave": "Rotted", "valor": "1"}, 
     {"chave": "galls-cysts", "valor": "2"} 
    ] 
    } 
] 

サンプルケース:

{ 
    "caso": 1, 
    "doenca": "diaporthe-stem-canker", 
    "areaDamaged": "low-areas", 
    "cankerLesion": "Brown", 
    "cropHist": "same-1st-yr", 
    "date": "Outubro", 
    "externalDecay": "firm-and-dry", 
    "fruitSpots": "dna", 
    "fruitingBodies": "Present", 
    "fruitPods": "Norm", 
    "germination": "90-100%", 
    "hail": "Yes", 
    "intDiscolor": "None", 
    "leafMalf": "Absent", 
    "leafMild": "Absent", 
    "leafShread": "absent", 
    "leafspotsHalo": "absent", 
    "leafspotSize": "dna", 
    "leafspotsMarg": "dna", 
    "leaves": "Abnorm", 
    "lodging": "No", 
    "moldGrowth": "Absent", 
    "mycelium": "Absent", 
    "plantGrowth": "Abnorm", 
    "plantStand": "Normal", 
    "precip": "gt-normal", 
    "roots": "Norm", 
    "sclerotia": "Absent", 
    "seed": "Norm", 
    "seedDiscolor": "Absent", 
    "seedSize": "Norm", 
    "seedTmt": "none", 
    "severity": "pot-severe", 
    "shriveling": "Absent", 
    "stem": "Abnorm", 
    "stemCankers": "Above-sec-nde", 
    "temp": "norm" 
    } 

だから私はareaDamagedている:低領域は、私がareaDamagedからの低領域の値を取ることにしたいです。誰でも良い方法を知っていますか?

答えて

2

私はでは、 "より良い" あなたは "より効率的な" を意味すると仮定します。

もしそうなら、どこにでも配列がある限り、「より良い」方法はありません。

しかし、あなたの配列は何度も何度もアクセスする参照データを保持しているようです。私は時々このような場合にはマップを配列に変換され、彼らはより速く動作し、このような何か:

var refDataMap = {}; 

var refDataItem, refDataValue; 

for (var i = 0; i < refData.length; i++) { 
    refDataItem = refData[i]; 
    refDataMap[refDataItem.atributo] = refDataItem; 
    refDataItem.valoresMap = {}; 
    for (var j = 0; j < refDataItem.valores.length; j++) { 
     refDataValue = refDataItem.valores[j]; 
     refDataItem.valoresMap[refDataValue.chave] = refDataValue.valor; 
    } 
} 

var result = refDataMap["seed"].valoresMap["Abnorm"]; // Gives value 1 

私はいくつかのパフォーマンステストを作成しましたし、このようにマップにアクセスする〜25%高速であることがわかりますこれらの配列を反復するよりも(http://jsben.ch/#/ADhFC)。

ただし、マップ初期化シーケンスをテストに含めると、1回のアクセス(http://jsben.ch/#/GQBC0)で測定された場合、配列は2倍高速です。

地図の初期化のオーバーヘッドが(http://jsben.ch/#/b6vbs)になるまでに〜50回アクセスする必要があることがわかりました。

+0

うわー、ありがとう!正直言って私は実装が簡単な方法を探していましたが、あなたの答えは実装と効率面では最高です。本当にありがとう!そして、ええ、私は300回以上これにアクセスするので、それは私のために良いでしょう –

+0

助けになることを喜んで:]幸運! – Avius

1

jsonの内部で "valor"と "chave"プロパティを使用する代わりに、json構造でキー/値directを使用できます。

var propriedades = {  
    "areaDamaged" : { 
     "similaridade": "Sim", 
     "valores": { 
      "Desconhecido" : "?", 
      "scattered" : "0", 
      "low-areas" : "1", 
      "upper-areas" : "2", 
      "whole-field" : "3" 
     } 
    }, 
... 

次にあなたが値を簡単に取得することができます:このように

var valor = propriedades["areaDamaged"].valores["low-areas"]; 
+0

ありがとうございます!それはまさに私が必要としたものでした –

関連する問題