为什么indexOf()在值存在时仍然返回-1

时间:2015-02-25 22:37:22

标签: javascript jquery

我从products.csv获取产品代码并将它们推送到产品数组中。当我在数组中搜索一个字符串时,它仍然返回-1,而它已经有一个匹配的值。

jQuery.get('v/wds-custom/products.csv', function(data) {
  var products = new Array();
  var rows = data.split("\n");
  for (var i = 0; i < rows.length; i++)
    products.push(rows[i].toLowerCase());
  if($('#vCSS_mainform').length > 0) {
    var mainform_action = $('#vCSS_mainform').attr('action').toLowerCase();
    if(mainform_action.indexOf("productdetails.asp") > -1) {
      var current_productCode = decodeURIComponent(mainform_action.split("=")[1]);
      console.log(products);  // ["alg-207", "alg-357", "alg-434"]
      console.log(current_productCode);  // alg-207
      console.log(products.indexOf(current_productCode)); // -1
    }
  }
});

重要提示:如果我使products.csv单行只有alg-207,则返回0,但不能处理多行。

2 个答案:

答案 0 :(得分:1)

我怀疑你看到了控制台的神器。控制台可能有点棘手:如果它向您显示> Array[3]产品,然后您单击箭头查看它们,它可能会向您显示数组的内容,当您单击时箭头,而不是记录行。 (是的,真的。)Chrome的工作方式是这样的(有时,根据控制台是关闭还是打开时调用log - 是的,确实如此),以及其他人也可以。这是console.log无法替代设置断点和单步执行代码,在执行暂停时实时检查变量的众多原因之一。

但是,如果由于某种原因你 使用console.log而不是调试器,你可以通过执行以下操作来使其成为日志文本而不是实时对象引用:

console.log(JSON.stringify(products));

......而且相似。

答案 1 :(得分:0)

根据您的重要,并假设data是一个CSV字符串,可能是您在CSV解析中缺少一个步骤。算法在"\n"上拆分,但从不在逗号上拆分。因此对于具有多个条目的许多CSV行,例如

alg-207,alg-208
alg-203,alg-105

您可能会获得一个类似于以下内容的产品数组:

["alg-207,alg-208","alg-203,alg-105"]

这可以解释为什么当你搜索的项目包含单个元素的行时,它会起作用,但不会包含多个元素。

如果是这种情况,你需要添加逻辑来分割逗号上的每一行,以获得要处理的数组数组。

如果不是您有多个元素的行,我不确定会发生什么。