【问题标题】:CSV String (Split) into Array Bizarre Equality BehaviorCSV 字符串(拆分)成数组奇怪的相等行为
【发布时间】:2013-07-24 21:29:46
【问题描述】:

更新 - 这似乎是一个本地化的错误。将做进一步的测试以验证...

我有一个 CSV 字符串(带空格),看起来像这样:

var myString = "Here is a value, I am an important value, One last value"

我使用var myArray = myString.split(", ") 将该字符串拆分为一个字符串数组。所以myArray 中的值如下:

// myArray[0] = "Here is a value"
// myArray[1] = "I am an important value"
// myArray[2] = "One last value"

现在,我在 for loop 中使用简单的 if 语句来评估 “我是一个重要的价值” 是否在该 CSV 字符串中,如下所示:

for (var i = 0; i < myArray.length; ++ i) {
  if (myArray[i] == "I am an important value") {
    myBool = true;
  }
}

我还尝试了if (myArray[i] == 'I am an important value') 以及 `if (myArray[i].toString() == "I am an important value")

奇怪的是值 is 包含在 CSV 字符串中,它们被正确分隔(没有尾随空格等),但条件不返回 true 出于某种原因。有谁知道我是否缺少一些隐藏的东西?我故意使用== 以便它进行类型转换。 === 对结果没有影响。它会遍历myArray 中的每个元素,并在看到值后立即将myBool 标记为true,所以我很难理解为什么它不能立即工作。

更奇怪的事情是我统计了myArray中每个元素的字符并将它们与输入字符串匹配。它们完全匹配,一个字符一个字符。那么为什么相等的行为不正确呢?

PS - 我遇到的这个问题的真的真的奇怪的是,我在函数的前面有相同类型的方法,具有相同的确切输入类型,它工作得很好.例如,如果我要从原始 CSV 字符串中删除 "Here is a value",则满足条件并且 myBool 变为真(似乎只要比较值是第一个元素,则条件成立;否则,不成立)。

PPS - 原始 CSV 字符串中的各个值中永远不会有逗号,因此 myString.split(", "); 适合我正在做的事情。

更新:我将函数分离到它自己的脚本文件中,并对其进行了测试。这就是奇怪的行为所在(String.split() 到底在做什么?

/*
* This is how the data is set up in my script. There is an Object that has a property which is a String.
* The object itself is passed as a paramter, and I check the
*/

function start() {

  var myObject = {
    "property": "Here is a value, I am an important value, One last value",
    "extra": false,
  }

  var result = stringSplitTest(myObject);

  Logger.log("Result: " + result);
}


function stringSplitTest(someObject) {

  var myBool = false;

  var stringToSplit = someObject.property;
  Logger.log(stringToSplit);

  var array = stringToSplit.split(", ");

  for (var i = 0; i < array.length; ++ i) {
    Logger.log("Index " + i + ": " + array[i]);

    if (array[i] == "I am an important value") {
      myBool = true;
      break;
    }
  }
  return myBool;
}

日志输出

[13-07-25 11:29:45:628 EDT] Here is a value, I am an important value, One last value
[13-07-25 11:29:45:628 EDT] Index 0: Here is a value
[13-07-25 11:29:45:628 EDT] Index 1: I am an important value
[13-07-25 11:29:45:628 EDT] Result: true

【问题讨论】:

  • 它工作正常:jsfiddle.net/sKkdT/1,所以我敢打赌编码或类似的东西有些奇怪?
  • 嗯,确实缺少 Google 文档,所以我找不到任何关于他们用于 Google Apps 脚本的特定 Javascript 实现(这是我正在使用的)。据我所知,String.split() 是一个原生 Javascript 函数,所以理论上它应该像 @Ian 的 JSFiddle 一样工作......正如我在原始帖子中所说,如果我正在寻找的值是 索引0处数组的第一个元素,脚本有效。但否则它会失败。可能有某种我缺少的隐藏索引优势复合体?我认为这应该可行,但谷歌......伙计......
  • WRT 正在使用哪个 Javascript 实现:This answer 链接到 Google 文档中声称 ECMAScript 5 / js 1.8 的部分。
  • 感谢 Mogsdad,已加入书签 :)

标签: javascript arrays csv split google-apps-script


【解决方案1】:

您的代码也可以在 GAS 中使用,正如您所说,这是使用直接的 javascript...问题一定出在其他地方。

GAS 功能测试:

var myString = "Here is a value, I am an important value, One last value",
    myArray = myString.split(", "),
    myBool = false;
function test(){
for (var i = 0; i < myArray.length; ++ i) {
    if (myArray[i] == "I am an important value") {
        myBool = true;
        break;
    }
  }
Logger.log(myBool);
}

【讨论】:

  • Serge,感谢您一直在帮助解决我愚蠢的 GAS 问题:P 我拆分了函数,现在注意到 String.split() 正在截断字符串中的最后一个值并从数组中省略它。这就是为什么在一种情况下(字符串中只有一个值,不需要拆分)它返回 true,但是当我正在寻找的值(不幸的是)恰好在最后一个 would-be 数组的索引,它从未“实际存在”。所以String.split() 省略了最终值,我不知道为什么。有没有办法解决这个问题?
  • 更新...真令人沮丧...最初我从电子表格中出现的单元格中复制/粘贴了我在脚本中查找的值(复选框表单提交值),然后我把在if 条件下。它总是返回错误。所以我记录了结果并从那里复制/粘贴。这两个字符串在字面上是完全相同的字符,但神奇的是,基于日志的复制/粘贴有效,而从电子表格复制则无效?我不知道……但这确实令人困惑。关于为什么会发生这种情况的任何想法?
  • 哦,还有很多 cmets,但是 PS - 在第一次不起作用后,我将复制/粘贴的单元格转换为纯文本,这没有任何区别。这两个字符串完全相同,字符对字符,空格对空格。我唯一可能的假设是电子表格的编码方式与 GAS 不同,并且当文本悬空时,它们不能很好地结合在一起。所以总而言之,计算机是精神的。这是一个错误吗?这肯定不是预期的行为,我可以轻松地重新创建不应该发生的问题。
  • 我刚刚注意到您在 ', ' (逗号+空格)而不是仅逗号上拆分。你应该改变它,数组元素之间没有空格,它只是一个表示。如果你需要摆脱前导/尾随空格,请使用正则表达式函数来实现。有很多优秀的examples on this forum (javascript tag)
  • 哦,我知道数组元素中没有任何空格。初始表单是以“检查所有适用”方式的选项列表,表单将其发送到电子表格中形成 “元素 1、元素 2、元素 3、元素等”,所以理论上按 ", " 拆分应该可以正常工作并给出 [0] = "Element 1", [1] = "Element 2" 等?就像我说的,我从电子表格中复制/粘贴了比较文本,但它不起作用。然后我从日志输出中复制/粘贴它确实。因为我没有更改.split() 参数,所以出现了一些问题,并且原始字符串没有更改。
猜你喜欢
  • 1970-01-01
  • 2015-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多