2017-08-16 9 views
0

私は、異なる車両を持つオブジェクトを返すjsonレスポンスを持っています。各製品は、車両の色に関連する属性としてhexcode値を持っていますjsonレスポンスから最も暗い16進コードを特定する

[ { "name":"Ford", "hexCode": "4B1A1F"}, 
    { "name":"BMW", "hexCode": "FFFFFF"}, 
    { "name":"Fiat", "hexCode":"000000"} 
] 

私がやりたい何か1ではないすべてのメーカー以来、最も暗い色であると思われる、hexcodesから決定することができるです#000000を黒に使用します。

これは、何らかの並べ替えや正規表現やJSのどちらでも可能ですか?

+0

どのように暗いの定義は可能でしょうか?例えば、#0000ffは#0000ffというより暗く明るいでしょうか?その後、明るさを測定する必要がありますか? – DevDig

+2

何か試しましたか? –

+0

値をグレースケールに変換し、値を比較してください。Marcin Orlowskiのベストアンサー – webdeb

答えて

2

すべてのメーカーが#000000を黒色に使用するわけではないためです。

darkestが本当に意味するものを定義したら、簡単になります。あなたのソースデータが不正確であるということは一見しても助けにならないが、依然としてあなたのニーズにそれを使うことは可能であるはずである。あなたが本当に気にするのは、色そのものではなく、輝度であるから、それはconvert the value of provided color to gray-scaleにショットして、最も暗いものとして0x00に一番近いものを取り上げるべきです。

+1

"値をグレイスケールに変換する"というのはとても良いアイデアだ! – webdeb

0

すでにJavascriptを使用している場合はregexを使用しないでください。変数にjsonを代入すれば、javascriptはそれを解析し、各色をHSLに変換し、L値で最小値を求めます。

HSLは、色相、彩度、明度によって色を定義する配色であるため、色がどのように「暗い」かを客観的に測定できます。

0

最小値を見つけるには、16進数で与えられたRGB色の輝度(Y)値を比較する必要があります。式は次のとおりです。

Y = 0.299R + 0.587G + 0.114B 

したがって、次のようにすることができます。

function getY(hexValue){ 
 
    return hexValue.match(/[0-9a-fA-F]{2}/g) 
 
       .map(h => parseInt("0x"+h)) 
 
       .reduce((r,c,i) => (r[3] += r[i]*c, r),[0.299,0.587,0.114,0])[3]; 
 
} 
 

 
var data = [ { "name":"Ford", "hexCode": "4B1A1F"}, 
 
      { "name":"BMW", "hexCode": "FFFFFF"}, 
 
      { "name":"Fiat", "hexCode":"000000"} 
 
      ], 
 
    result = data.map(d => Object.assign({},d, {Y: getY(d.hexCode)})) 
 
       .reduce((p,c) => p.Y <= c.Y ? p : c); 
 

 
console.log(result);

関連する問題