首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JS indexOf失败,总是返回-1

JS indexOf失败,总是返回-1
EN

Stack Overflow用户
提问于 2021-10-15 14:10:32
回答 3查看 70关注 0票数 0

我是个新手,没有太多经验。现在尝试用JS解决工作中的一些问题,我遇到了一个大麻烦。我尝试阅读一些建议的QA,但没有解决方案。我诚心诚意地寻求帮助,任何帮助都是非常感谢的。

html:

代码语言:javascript
复制
 <script>
  document.getElementById("autoin").addEventListener("input",doSearch);
  function doSearch(){
    var ai = document.getElementById("autoin").value;
    google.script.run.withSuccessHandler(udAg).getAgent(ai);
  }
  function udAg(ag){
    document.getElementById("agent").value = ag;
    M.updateTextFields();
  }
 </script>

google脚本:

代码语言:javascript
复制
 function getAgent(ai){
  var ss = SpreadsheetApp.openByUrl(url);
  var ws = ss.getSheetByName("Updated");
  var ctList = ws.getRange('A2:A17').getValues();
  var position = ctList.indexOf(ai);
  return position;
  }

它总是返回-1,即使我用直接字符串'ABC'替换了变量ai,这也是A2中的字符串。尝试同时返回aictList[0],它们似乎是相同的,'ABC'

console.log(ctList)显示[ [ 'ABC' ], [ 'CDE' ],[ 'EFG' ],... ]

我真的想不出解决办法,我真的需要麻烦大家来帮忙。谢谢。

EN

回答 3

Stack Overflow用户

发布于 2021-10-15 14:15:32

解释

它返回-1,因为您在包含子数组的数组上运行indexOf(),所以它不能匹配您的字符串。

例如,我可以将您的示例作为最小测试用例,并执行以下操作:

代码语言:javascript
复制
  const array = [ [ 'ABC' ], [ 'CDE' ],[ 'EFG' ] ];

  console.log(array.indexOf('ABC')); // -1

显然,它返回-1,因为它在array变量中找不到匹配的"ABC"字符串:"ABC"包含在一个更深一层的子数组中。即它包含在array[0]中,特别是在array[0][0]中。

如果您阅读Array.indexOf()__的,您会注意到它将尝试查找与数组中的参数匹配的项。您正在由字符串数组组成的数组中查找字符串。

这就是为什么尝试查找ctList[0]会有效,因为它是身份匹配:

代码语言:javascript
复制
// returns -1 : correct string value, not an object equality, though
console.log(array.indexOf(['ABC'])); 

// returns 0: same object that's being looked up
console.log(array.indexOf(array[0]));

解决方案

因此,从您的示例中很难知道您真正想要做的是什么,但是看起来您实际上想要查找包含字符串的数组的位置,而不是字符串的位置。如果是这种情况,并且每个子数组总是只有一个元素,那么这将适用于我的示例:

代码语言:javascript
复制
array.map(subarray => subarray[0]).indexOf('ABC'); // 0: YAY!

或者对于你的情况:

代码语言:javascript
复制
ctList.map(subarray => subarray[0]).indexOf(ai);
票数 2
EN

Stack Overflow用户

发布于 2021-10-15 14:21:19

尝试在getValues()之后添加flat():

代码语言:javascript
复制
function getAgent(ai) {
  var ss = SpreadsheetApp.openByUrl(url);
  var ws = ss.getSheetByName("Updated");
  var ctList = ws.getRange('A2:A17').getValues().flat();//added flat
  var position = ctList.indexOf(ai);
  return position;
}

即使是一行或一列返回为二维数组,索引也不能真正与二维数组一起工作。您可以通过其他方式和flat()做同样的事情,比如使用map。

票数 2
EN

Stack Overflow用户

发布于 2021-10-15 14:18:41

代码的这一部分位于脚本标记之外:

代码语言:javascript
复制
function getAgent(ai){
  var ss = SpreadsheetApp.openByUrl(url);
  var ws = ss.getSheetByName("Updated");
  var ctList = ws.getRange('A2:A17').getValues();
  var position = ctList.indexOf(ai);
  return position;
  }

...by方式-1是indexOf函数的正确值,也就是说,搜索值不是数组的一部分。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69586082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档