2

我有一个我创建的数组,我想检查它以确保它不包含重复值。

我的方法是创建第二个数组 (tempArray) 从第一个数组 (uniqueLabel) 中获取值,并针对 tempArray 中的所有项目测试该值。如果未检测到该值,请将其插入。否则提醒用户

   var tempArray = []; //temp array to store names
   $.each(self.producNames().SelectedAttributes(), function (index, value) {

  var uniqueLabel = value.LabelName().toLowerCase();
  //I did have the evaluation set to !($.inArray(value.LabelName().toLowerCase(), tempArray, 0)
  //however this alwasy returned false I set it to true just to see what would happen 
  //now it always returns true
  if ($.inArray(value.LabelName().toLowerCase(), tempArray, 0)) {
       tempArray.push(value.LabelName());
       console.log(value.LabelName() + " added to array[]");
     }
      else {
       console.log("label " + uniqueLabel + " already exists at index "+ tempArray.indexOf());
     }

我对 jQueryinArray()函数不太熟悉,但在查看文档时,我的设置方式似乎是正确的。但是有些事情是不正确的,因为当我传入重复的标签名称时,它们会被插入到我希望操作返回 0 并执行 else 块的数组中。相反,它总是返回 true。

关于我在这里不正确的任何建议?

谢谢

4

3 回答 3

3

$.inArray()不返回布尔值。它返回匹配项的索引,或者-1如果它没有找到。如果您尝试将其用作布尔值,则当匹配位于索引 0 时将为 false,如果未找到或位于其他索引处则为 true,这显然不是您想要的。

你要:

var pos = $.inArray(uniqueLabel, tempArray);
if (pos == -1) {
   tempArray.push(uniqueLabel);
   console.log(uniqueLabel + " added to array[]");
 } else {
   console.log("label " + uniqueLabel + " already exists at index "+ pos);
 }
于 2013-10-02T20:02:26.267 回答
2

$.inArray()返回数组中项目的索引,或者-1如果未找到该项目。

因此,您的if语句将始终返回 true,除非您要搜索的项目是数组中的第一项,在这种情况下,返回值为0,其计算结果为 false。

尝试这样的事情:

if ($.inArray(value.LabelName().toLowerCase(), tempArray, 0) > -1) {
    //found it
} else {
    // not there
}

像这样的东西可能更有效(在我看来,也更容易阅读):

var tempArray = [];
$.each(self.productNames().SelectedAttributes(), function(index, value) {
    if (tempArray[value.LabelName()]) {
        //found it
    } else {
        tempArray[value.LabelName()] = 1;   
    }    
});
于 2013-10-02T20:02:06.697 回答
0

这可能就像使用jQuery.unique()一样简单。

从他们的文档中:

“该$.unique()函数搜索对象数组,对数组进行排序,并删除任何重复的节点。如果一个节点与数组中已有的节点完全相同,则认为该节点是重复的;具有相同属性的两个不同节点不被视为是重复的。”

文档继续说它只适用于 DOM 元素的数组,但是我只是用字符串测试了它,它工作得很好。

$.unique(['1', '2', '2', '3', '1']);
//=> ['3', '2', '1']

希望有帮助。

于 2013-10-02T20:04:32.710 回答