javascript cannnot检测数组中的相同元素

时间:2016-11-02 10:07:50

标签: javascript jquery

我有以下代码:

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中实现?

3 个答案:

答案 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对象的形式使用其他结构,例如哈希。