2016-07-30 126 views
1

我想标识传入数据,并且需要为相同的颜色应用完全相同的颜色。使用JSON数据为特定值获取特定颜色

数据序列按照固定顺序(但都可能存在或不存在),需要应用如下所述的固定颜色。

例如,预期的数据序列和色序是象下面这样:

CLOSED   GREEN 
VERIFIED   GREEN 
RESOLVED   YELLOW 
REOPENED   RED 
IN_PROGRESS  BLUE 
ASSIGNED   BROWN 
NEW    BROWN 
UNCONFIRMED  BROWN 

所以每当CLOSEDGREEN颜色应适用,对于RESOLVED - >YELLOW和....用于UNCONFIRMED - >BROWN

现在的问题是所有的数据可能会来,可能不会来,例如,

CLOSED 
VERIFIED 
IN_PROGRESS 
UNCONFIRMED 

像Java脚本这么写的基本逻辑:

if (jsonData.search("CLOSED") != -1 
    && jsonData.search("VERIFIED") != -1 
    && jsonData.search("IN_PROGRESS") != -1 
    && jsonData.search("UNCONFIRMED") != -1) { 

    colors: ['green', 'green', 'blue', 'brown'], 

} else if (jsonData.search("IN_PROGRESS") 
    && jsonData.search("ASSIGNED") != -1) { 

    colors: ['blue', 'brown'], 

} else if (jsonData.search("IN_PROGRESS")) { 

    colors: ['blue'], 

} else if (jsonData.search("CLOSED") != -1 
    || jsonData.search("VERIFIED") != -1) { 

    colors: ['green'], 
} 

这将工作上面的序列,但只要数据将是例如不同

IN_PROGRESS 
NEW 

OR

RESOLVED 
REOPENED 
NEW 

OR

CLOSED 
IN_PROGRESS 

OR

RESOLVED 
NEW 

等。很多很多的组合...

然后这将失败,并将错误的颜色应用于数据。如果我写出每一个数据和各个序列的条件,那么我会变得疯狂,而且它完全无效,乏味且非常复杂。

下面是样本JSON数据:

{"cols":[{"label":"status","type":"string"},{"label":"count","type":"string"}],"rows":[{"c":[{"v":"VERIFIED"},{"v":16}]},{"c":[{"v":"RESOLVED"},{"v":1}]},{"c":[{"v":"IN_PROGRESS"},{"v":14}]},{"c":[{"v":"ASSIGNED"},{"v":39}]},{"c":[{"v":""},{"v":0}]}]} 

{"cols":[{"label":"status","type":"string"},{"label":"count","type":"string"}],"rows":[{"c":[{"v":"CLOSED"},{"v":3}]},{"c":[{"v":"VERIFIED"},{"v":13}]},{"c":[{"v":"RESOLVED"},{"v":2}]},{"c":[{"v":"IN_PROGRESS"},{"v":26}]},{"c":[{"v":"ASSIGNED"},{"v":2}]},{"c":[{"v":""},{"v":0}]}]} 

{"cols":[{"label":"status","type":"string"},{"label":"count","type":"string"}],"rows":[{"c":[{"v":"IN_PROGRESS"},{"v":3}]},{"c":[{"v":"NEW"},{"v":8}]},{"c":[{"v":""},{"v":0}]}]} 

{"cols":[{"label":"status","type":"string"},{"label":"count","type":"string"}],"rows":[{"c":[{"v":"RESOLVED"},{"v":12}]},{"c":[{"v":"IN_PROGRESS"},{"v":9}]},{"c":[{"v":"ASSIGNED"},{"v":15}]},{"c":[{"v":""},{"v":0}]}]} 

{"cols":[{"label":"status","type":"string"},{"label":"count","type":"string"}],"rows":[{"c":[{"v":"VERIFIED"},{"v":6}]},{"c":[{"v":"IN_PROGRESS"},{"v":40}]},{"c":[{"v":"ASSIGNED"},{"v":7}]},{"c":[{"v":"NEW"},{"v":8}]},{"c":[{"v":""},{"v":0}]}]} 

{"cols":[{"label":"status","type":"string"},{"label":"count","type":"string"}],"rows":[{"c":[{"v":"CLOSED"},{"v":3}]},{"c":[{"v":"VERIFIED"},{"v":35}]},{"c":[{"v":"RESOLVED"},{"v":15}]},{"c":[{"v":"IN_PROGRESS"},{"v":92}]},{"c":[{"v":"ASSIGNED"},{"v":63}]},{"c":[{"v":"NEW"},{"v":16}]},{"c":[{"v":""},{"v":0}]}]} 

可有人想着有效逻辑而不是写确切顺序个人数据+色似提到?

请让我知道如果有任何问题或我错过了任何东西。

+0

为什么不能分别处理每一行数据,而不是将其视为一个序列。 –

+1

JSON数据的外观如何? –

+0

因为我想根据顺序应用颜色。您如何分别处理数据? –

回答

1

考虑到数据的顺序是固定的顺序和你对待JSON字符串,我建议以下解决方案:

const DataMap = { 
    CLOSED: 'green', 
    VERIFIED: 'green', 
    RESOLVED: 'yellow', 
    REOPENED: 'red', 
    IN_PROGRESS: 'blue', 
    ASSIGNED: 'brown', 
    NEW: 'brown', 
    UNCONFIRMED: 'brown' 
}; 

let colors = []; 

Object.keys(DataMap).forEach((key, index) => { 
    if (jsonData.search(key) !== -1) { 
    colors.push(DataMap[key]); 
    } 
}); 

请看jsFiddle

+0

嗨,亚历克斯,谢谢;接受你的答案!扩展到这个,当我把数据放在谷歌图表。它不接受来自数据图的颜色。你能帮我在http://stackoverflow.com/questions/38673317/google-chart-throws-error-for-invalid-color-due-to-values-received-using-datamap? –

+0

@Jits我一定会很快看看。 –

+0

可以请你帮我在http://stackoverflow.com/questions/38816339/json-response-incorrectly-matches-partial-key-for-color-data以及?提前致谢! –