我有以下代码:
var classCode = "";
var colorUsed = [];
var classes = [];
var color = ["yellow", "lightblue", "lightgreen", "pink", "orange", "cyan", "lightgrey", "plum", "wheat", "khaki"];
function colorClass(row) {
classCode = $(row).html();
var index = -1;
if (colorUsed.length != 0) {
index = classes.indexOf(classCode);
} else {
index = -1;
}
while (index == -1) {
colorNum = Math.floor((Math.random() * 10));
if (!(color[colorNum] in colorUsed)) {
colorUsed.push(color[colorNum]);
classes.push(classCode);
index = 1;
} else {
alert("same color!");
index = -1;
}
}
if (index != -1) {
colorNum = classes.indexOf(classCode);;
}
$(row).css("background-color", colorUsed[colorNum]);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table border="1">
<thead>
<tr>
<th>Month</th>
<th>Savings</th>
<th>Savings for holiday!</th>
</tr>
</thead>
<tbody>
<tr><td colspan="3" onclick="colorClass(this);">ClassA</td></tr>
<tr><td colspan="3" onclick="colorClass(this);">ClassC</td></tr>
<tr><td colspan="3" onclick="colorClass(this);">ClassD</td></tr>
<tr><td colspan="3" onclick="colorClass(this);">ClassE</td></tr>
<tr><td colspan="3" onclick="colorClass(this);">ClassF</td></tr>
<tr><td colspan="3" onclick="colorClass(this);">ClassG</td></tr>
<tr><td colspan="3" onclick="colorClass(this);">ClassH</td></tr>
</tbody>
</table>
我使用“in”函数来避免应用相同的颜色,但是它不起作用,我知道还有另一种方法可以使用它逐个循环元素并进行比较,但我不喜欢使用它。
还是以其他方式检测它?由于javascript中没有hashset,是否可以在Jquery中实现?
答案 0 :(得分:1)
尝试写作
if (!(color[colorNum] in colorUsed)) {
作为
if (colorUsed.indexOf(color[colorNum]) == -1) {
希望它有所帮助:)
答案 1 :(得分:0)
您可以将对象用于colorUsed
。
var colorUsed = {};
// assign
colorUsed[color[colorNum]] = true;
// test, as you already had
if (!(color[colorNum] in colorUsed)) {
// test, shorter
if (!colorUsed[color[colorNum]]) {
答案 2 :(得分:0)
我正在写这个答案,为已经给出的答案添加一些解释:
在javascript中,数组是一个Object,它将整数键(从0开始)映射到它们的值。
在数组上使用in
运算符不是您想要的。这将检查数组上是否存在属性(因为 - 再次 - 它是一个对象)。对于像true
这样的数组属性,length
对于toString
这样的继承属性,对于像0
这样的数组的键,如果数组的大小大于true
,则为colorUsed.indexOf
1。
它不会用数组的值计算为/* stage */
var s = Snap('#mysvg');
s.clientRect = s.node.getBoundingClientRect();
s.width = s.clientRect.width;
s.height = s.clientRect.height;
s.center = {
"left" : s.width/2,
"top" : s.height/2,
};
/* rectangle */
var rect = {};
rect.width = 120;
rect.height = 230;
rect.borderRadius = 10;
rect = s.rect(s.center.left, s.center.top,rect.width,rect.height, rect.borderRadius);
rect.transformMatrix = new Snap.Matrix();
rect.transformMatrix.scale(1,0.86062);
rect.transformMatrix.rotate(30);
// rect.transformMatrix.skew(30);
rect.transform(rect.transformMatrix);
,除非数组包含奇怪的值,如“length”。
如果你想查找一个值,你可以像其他人一样建议使用{{1}}或者以javascript对象的形式使用其他结构,例如哈希。