Javascript 检查值是否存在于不使用包含的对象数组中

Javascript 检查值是否存在于不使用包含的对象数组中,javascript,html,Javascript,Html,标题注释:我真的不知道如何完美地命名这个问题。如果有人能建议一个更合适的标题,请这样做 我有一个表格,其中标题必须根据其名称的前7个字符进行着色 前7个字符是yyyy.mm。例如2017.10 这是我的需要: 我希望相同7个字符的每次出现都是相同的颜色(单元格的背景色)。换句话说,如果cell的前7个字符是2017.10-它们都应该是相同的颜色。如果是2017.09,则颜色应相同,但与2017.10或任何其他日期不同 我正在努力做这件事,但很难完成。我感觉我很亲近 JS: 函数setHea

标题注释:我真的不知道如何完美地命名这个问题。如果有人能建议一个更合适的标题,请这样做

我有一个表格,其中标题必须根据其名称的前7个字符进行着色

前7个字符是yyyy.mm。例如2017.10

这是我的需要:

  • 我希望相同7个字符的每次出现都是相同的颜色(单元格的背景色)。换句话说,如果cell的前7个字符是2017.10-它们都应该是相同的颜色。如果是2017.09,则颜色应相同,但与2017.10或任何其他日期不同
我正在努力做这件事,但很难完成。我感觉我很亲近

JS:

函数setHeaderColor(){
const mainTable=document.getElementById('main-table');
const headerRow=document.querySelectorAll(“#主表tr:first child th”);
const test=[];//保存每个列标题的前7个字符和背景色
常量颜色=[
#FF6633'、#FFB399'、#FF33FF'、#FFFF99'、#00B3E6',
#E6B333'、#3366E6'、#999666'、#99FF99'、#b34dD',
"80B300","809900","E6B3B3","6680B3","66991A",,
"FF99E6","CCFF1A","FF1A66","E633A","33FFCC",
"66994D","B366CC","4D8000","B33300","CC80CC",,
"66664D","991AFF","E666FF","4DB3FF","1AB399",,
"E666B3","33991A","CC9999","b3631a","00E680",,
"4D8066","809980","E6FF80","1AF33","999933",,
"FF3380","CCCC00","66E64D","4D80CC","9900B3",,
#E64D66'、#4DB380'、#FF4D4D'、#99E6E6'、#6666FF'
];
headerRow[1].style.backgroundColor=颜色[1];
//从列标题名称中提取前7个字符
for(设i=0;i

名称
2017.10-T-2018_08_30 ms_201709。
2017.09-T-2018_08_30 ms_201709。
2017.10-T-2018_08_30 ms_201709
2017.09-T-2018_08_30 ms_201709
2017.08-T-2018_08_30 ms_201709

听起来您想查找之前是否为yyyy.mm字符串指定了颜色值。这种查找的最佳数据结构是映射,而不是数组

在Javascript中,将对象用作哈希映射非常常见:

constcolormap={};
常量颜色=['#FF6633'、'#FFB399'、'#FF33FF']
//通过传入“yyyy.mm”字符串来使用此函数
函数getColorFor(firstSevenChars){
if(颜色映射[firstSevenChars]!==未定义){
//我们以前遇到过这个角色组合!
//检索相应的颜色。
返回颜色映射[firstSevenChars];
}
//获取下一个自由颜色,即第n+1个颜色,
//n是已分配的颜色数。
//使用模(%)确保不超过颜色数组。
让newColor=colors[Object.keys(colorMap.length%colors.length];
//将yyyy.mm代码与新颜色关联并返回它。
colorMap[firstSevenChars]=新颜色;
返回新颜色;
}
console.log(“2018.01”,getColorFor(“2018.01”);
console.log(“2018.02”,getColorFor(“2018.02”);
console.log(“2018.03”,getColorFor(“2018.03”);
log(“没有颜色了!再次循环它们…”);
console.log(“2018.04”,getColorFor(“2018.04”);

console.log(“2018.05”,getColorFor(“2018.05”)所以只要创建一个查找表,如果键存在,就返回它,如果它没有获取新的颜色

const colors=['#FF6633'、'#FFB399'、'#FF33FF'、'#FFFF99'、'#00B3E6']
const used={}
函数getColor(键){
used[key]=used[key]| | colors.shift()
返回已用[键]
}
console.log(“aaa”,getColor(“aaa”))
log(“bbb”,getColor(“bbb”))
console.log(“aaa”,getColor(“aaa”))

console.log(“bbb”,getColor(“bbb”))
您需要使用一个内部for循环,它将查找所有匹配的版本并设置颜色

将循环更改为以下内容

for (let i = 1; i < test.length; i++) {
    for(let j=i;j<test.length; j++){
        if (test[i].version === test[j].version) {
          test[i].color = test[j].color
        } else {
          test[i].color = colors[Math.floor(Math.random() * colors.length)];
        }
    }
}
for(设i=1;ifor(让j=i;j1你似乎在问两个独立的问题1)如何正确设置颜色2)如何在会话之间保持颜色。我没有看到任何尝试2。您尝试了什么。另外,您说我希望相同7个字符的每次出现都是相同的颜色。前景色还是后景色?如果一个单元格包含两个值,它只能有一个背景色。请澄清。如果您希望保存颜色,而不是您需要使用的localStorage@ScottMarcus好的,我完全删除了第二个问题。我需要给单元格的背景上色-我现在是怎么做的。可能是@HereticMonkey的重复。不,不是。我已经提到我试过使用
includes
我不太明白
…你把
键作为什么传递de>?因为这就是你想要的!“2017.09”是一个……“2017.10”是另一个…等等,我要问的是我应该传递什么作为我的案例的关键。换句话说,你能给我一个与我的代码相关的例子吗。我不明白如何将你的答案与我的答案结合起来。谢谢你,非常感谢。我甚至没有使用存储部分,颜色总是一样的。我关闭窗口,com返回,颜色相同。保持原样或使用您的方法将其存储在本地存储之间有什么区别?随着时间的推移,日期会被删除吗?颜色最终会发生变化…如果y