【问题标题】:Unable to push modified string to a javascript array [duplicate]无法将修改后的字符串推送到 javascript 数组 [重复]
【发布时间】:2020-01-04 03:51:18
【问题描述】:

请考虑删除重复的问题标志。这不是一个重复的问题,因为它不是在询问如何修改字符串,而是解决了在将字符串方法正确应用于字符串时可能导致错误的错误。误解可能是由于没有阅读我用来说明问题的具体示例(从字符串中删除引号),但与该示例的具体内容无关。在所讨论的特定情况下,将任何字符串方法应用于任何字符串时,这是一个意外错误。谢谢。

(我知道如何截断或替换字符串,字符串方法在这里不起作用。我也知道如何从字符串中删除引号,这不是建议问题的重复。虽然我很感激帮助,但请仅在您回答时回答读过去我说我想删除引号的地方。我想知道为什么我在正确使用字符串方法时会出错)

我有一个包含数据集的数组。典型的集合(即数组元素)是包含用逗号分隔的数据对的字符串。所以第一个元素可能如下所示:

sets[0] = '"name":"dave","height":"tall","age":"old"'

每个元素都包含一个字符串,而不是一个数组(我已经通过为每个元素打印 typeof 来确认这一点)。

我处理每个元素以通过在逗号处拆分来形成其组成部分的数组:

let currentSet = sets[i].split(",");

因此,对于 sets[0] 示例,set[0] 将 currentSet 填充为:

currentSet = ['"name":"dave"', '"height":"tall"', '"age":"old"']

currentSet[0] = '"name":"dave"';

我现在想提取每个当前集合的“dave”部分并将其推送到一个新的结果数组中:

dat = currentSet[j].split(":")[1];
resArray.push(dat);

这按预期工作,我得到 '"dave"' 作为 resArray 中的一个新元素。

下一部分证明是困难的。我不想将“dave”(带有文字引号)推送到数组,而是将 dave(字符串中没有引号)推送到数组,而不是:

resArray = ['"dave"', '"tall"', '"old"']

我想要:

resArray = ['dave', 'tall', 'old']

我尝试使用 dat.slice dat.substring 和 dat.replace 来修改推送到数组的字符串,但都抛出错误(无法将字符串方法应用于 null)。

我并不是特别要求如何实现我想要的结果的解决方案(尽管我会欢迎我可能忽略的简洁解决方案),但我真的想了解为什么我似乎无法通过任何字符串方法处理 dat 并推送结果到一个数组。我应该再次强调,我已经使用 typeof 确认每个 dat 提取都是一个字符串。这让我发疯了。任何解释都将受到欢迎。

谢谢。

我处理每组起始数据的实际 javascript 行(带有切片示例):

for (var i = 0; i < sets.length; i++)
{
let currentSet = sets[i].split(",");
// e.g. sets[i] = '"name":"dave","height":"tall","age":"old"'
// e.g. currentSet = ['"name":"dave"', '"height":"tall"', '"age":"old"']
resArray[i] = [];

for (var j = 0; j < currentSet.length; j++)
{

dat = currentSet[j].split(":")[1];

resArray[i].push(dat.slice(1,dat.length-2)); // throws error
// resArray[i].push(dat) // works fine;
// resArray[i].push(typeof dat) // confirms dat type is string;

} // next subset j;

outArray[i] = resArray[i].join(",");

currentSet = null;

} // next sets i;

【问题讨论】:

  • 为什么不使用 JavaScript 对象而不是发明的字符串语法?
  • 无法将字符串方法应用于 null 给定您的代码无法重现 jsfiddle.net/6j4Lbuzp
  • 您可以使用简单的正则表达式resArray[i].push(dat.replace(/"/g, ''))替换引号
  • Nidhin - 没有。正如我所说,字符串方法不起作用,所以它不会重复,因为它提供了字符串方法。
  • 这不是方法的问题,dat 不知何故未定义。可能您需要检查dat = currentSet[j].split(":")[1]; 是否始终返回正确的值

标签: javascript arrays


【解决方案1】:

这应该可行。我为你的代码添加了一些变量来运行。

sets = [];
resArray = [];
outArray = [];
sets[0] = '"name":"dave","height":"tall","age":"old"';
for (var i = 0; i < sets.length; i++)
{
let currentSet = sets[i].split(",");
// e.g. sets[i] = '"name":"dave","height":"tall","age":"old"'
// e.g. currentSet = ['"name":"dave"', '"height":"tall"', '"age":"old"']
resArray[i] = [];

for (var j = 0; j < currentSet.length; j++)
{

var dat = currentSet[j].split(":")[1];

resArray[i].push(dat.slice(1,dat.length-1)); // throws error
// resArray[i].push(dat) // works fine;
// resArray[i].push(typeof dat) // confirms dat type is string;

} // next subset j;

outArray[i] = resArray[i].join(",");

currentSet = null;

} // next sets i;

问题在于,您从要添加到 resArray 的每个字符串的末尾删除了 1 个太多字符。只需将其从 -2 更改为 -1 即可。我不知道你可能会遇到什么错误。只需将此代码运行到 chrome 的开发控制台中即可。

编辑

好的,这是解决问题的编辑。出于某种奇怪的原因,我们不得不做一些骇人听闻的事情来让它工作,所以这可能没有意义,但要编辑 dat 变量,只需将其转换为这样的字符串:dat = ""+dat我在上面留下了其他代码以防万一其他人需要帮助解决同样的问题。

【讨论】:

  • 谢谢,但无论我从哪里切掉多少个字符,我都无法获得任何字符串方法来推送 Firefox 或 chrome。替换或子字符串方法也是如此。 Firefox 给出“TypeError:dat is undefined” Chrome 给出:“Uncaught TypeError: Cannot read property 'substring' of undefined”(或切片或替换,取决于我使用的方法)。
  • 要修复未定义的 dat,您只需将 "dat = currentSet[j]...." 更改为 "var dat = currentSet[j]...." 对于 chrome 错误,我什至不明白,因为代码中没有任何地方调用“子字符串”。我还应该提到,要测试它是否有效,只需控制台 log outArray 或 resArray
  • 只需复制我上面的确切代码,打开开发控制台就可以了。除非您在 chrome 上运行非常过时的版本。也在 Firefox 中进行了测试。
  • WhiteFire - 感谢您的建议。 dat 在我发布的 sn-p 之前声明。我有最新的 firefox 和 chrome 更新,并且两者都有错误。无论如何,字符串方法已经存在多年,应该可以在任何浏览器中使用。子字符串不在我发布的具体示例中,但它是我尝试修改日期时都会抛出错误的三种字符串方法之一(切片、子字符串和替换所有抛出错误)控制台没有用,因为我在网络中呈现数据页。还是谢谢。
  • 哇,这太疯狂了,我什至不明白为什么会这样。而不是这样做,您可以像这样进行一些普通的字符串转换:""+dat 这仍然应该将其转换为字符串而不向字符串添加任何字符。
【解决方案2】:

在我看来,使用替换是删除在字符串中多次找到的表达式或字符的最简单方法。如果您提供特定值,它只会在第一次出现时替换它,但是,当使用正则表达式时,它将替换找到的所有匹配项。如果您将您的行替换为以下内容,您的代码将按预期运行:

resArray[i].push(dat.replace(/"/g, ''));

【讨论】:

  • 大卫 - 不,我收到一个错误。我知道如何处理字符串,但似乎直截了当的是抛出一个错误。还是谢谢。
  • 为了测试,我使用了类似于上一个答案的变量声明。 (在该示例中使用切片或替换有效)尝试确保您的变量声明没问题,并将它们与上面的答案进行比较。您的数组 currentSet 在某些时候可能为空,或者 .split(':')[1] 可能返回 null 因为集合中的字符串不包含任何 ':' 这将通过抛出您上面提到的错误来中止执行,因为 dat将为空。出于测试目的,您可能想尝试在拼接/替换周围实现一个 try catch 块,看看它是否返回任何内容。
  • David - 当我运行相同的代码而不对 dat 应用任何字符串方法时,它工作正常。一切都已声明,并且 dat 按预期返回。当我将结果推送到数组时,它会在我对 dat 进行切片、子串或替换时引发错误。很奇怪。
  • 是的,这很奇怪,因为我们中的一些人似乎已经使用相同的代码让它在我们这边工作,它必须以某种方式与您的执行环境相关。我对此很感兴趣。这听起来像是一个愚蠢的问题,但是,您是从 html 文件运行脚本还是将 js 文件导入其中?如果您进行了导入,则可能在重新加载时缓存没有清除,并且您仍在运行曾经崩溃的旧版本脚本。
  • David - 我有一个简单的 html 文件,其中包含一个文本区域,我将要处理的 JSON 数据粘贴到其中。 html 文件(非外部)中的脚本将 JSON 文本拆分为 sets 数组,并将清理后的数据发送到网页上的第二个文本区域。我已经尝试重新启动,并且还通过编辑来跟踪所有失败以处理推送未修改的 dat(它总是可以正常工作)。我明天在另一台机器上试试。这很奇怪。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-17
  • 1970-01-01
  • 2020-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多