【问题标题】:Better way of splitting and assigning many values in Javascript?在 Javascript 中拆分和分配许多值的更好方法?
【发布时间】:2012-03-28 06:27:16
【问题描述】:

我有一个循环遍历用户创建的元素数量的 for 循环。这个插件中有很多可用的设置,每个元素都可以接收它的特定设置。

  1. 用户设置按以下格式输入:speed_x: "1000,500 > 1000,200 > 0,0" 这控制 3 个单独元素 的 speed_x 输入/输出。 > 按对象分隔,逗号分隔输入/输出。

  2. 所以我可以获取特定对象的 speed_x 值,我将 speed_x 拆分为 speed_x_set(按 > 拆分),结果是:

1 1000,500
2 1000,200
3 0,0`

3 在循环内部,我按索引获取值(因为它是对象#)并用逗号分割(得到 speed_x_in 和 speed_x_out。)

for(var i=0; i<OS.numberofobjects; ++i){
   OS.speed_x_on_set[i]=speed_x_set[i].split(",")[0],
   OS.speed_x_off_set[i]=speed_x_set[i].split(",")[1],
   ...
};

所有内容都由对象分配,并通过正确设置输入/输出到主操作系统设置对象中。 T*他的问题是我有很多很多设置需要以这种方式拆分...* 例如:delay_x_set、speed_y_set、opacity_set 等。它们的名称都是基于默认设置名称,添加了“_set”,如上所示。希望这提供了足够的信息。谢谢!

【问题讨论】:

  • 我会先将speed_x_set[objindex].split(",") 分配给变量,以避免将值拆分两次。
  • 对循环变量使用i 也有助于消除视觉噪音。
  • 赞成在循环中使用 i 作为迭代器变量。阅读真的很有帮助:)

标签: javascript arrays variables loops split


【解决方案1】:

我会避免两次访问同一个项目并为每次迭代执行两次相同的split。所以,你可以有类似的东西:

for (var i = 0, item; item = speed_x_set[i++];) {
  var values = item.split(",");
  OS.speed_x_on_set.push(values[0]);
  OS.speed_x_off_set.push(values[1]);
}

请注意,在 JavaScript 1.7 (Firefox) 中,您可以简单地拥有:

for (var i = 0, item; item = speed_x_set[i++];) {
  var [on, off] = item.split(",");
  OS.speed_x_on_set.push(on);
  OS.speed_x_off_set.push(off);
}

希望在 ECMAScript 的下一个版本中也是如此。 这叫做“解构赋值”。

【讨论】:

  • Awww,这太棒了,很有道理,谢谢!但问题是我有大约 60 个设置,所以实际的循环代码很长。他们都在做同样的事情。例如:用户可以在 3 个对象上设置 speed_x,如下所示:speed_x:"1000,500 > 1000,500 > 200,500"。前 2 个对象的 speed_x_in 为 1000,speed_x_out 为 500。第三个对象的 speed_x_in 为 200 和 500。它们首先按对象 ( > ) 拆分为 speed_x_set (所以我有 speed_x_set = index 1: 1000,500 , index 2: 1000,500 ... 等等。从那里我需要用逗号分隔并推入 OS.speed_x_set。
  • 我发布的代码运行良好,只是看起来像是一大堆代码。所以,我也有例如 delay_x (它的写法完全相同)。我不知道如何做到这一点...谢谢!
  • 不确定我是否关注你,我可能应该看到实际代码。但是,您已经可以减少一些代码,只进行一次拆分:values = speed_x.split(/,| &gt; /); 然后您有一个包含所有值的数组,并且您知道它们是成对的,您可以迭代它们。关于不同的对象,你也可以迭代它们:假设你有MyValues = {}; MyValues.speed_x = "..."; MyValues.speed_y = "...";你可以有:for (var prop in MyValues) doSomething(MyValues[prop]);类似的东西。
  • 我试过这样做,并认为这将是一个 for in 循环,但只要我将 for in 循环放入 for each 循环中,它总是会在 Dreamweaver 中引发语法错误。 . 我什至尝试在 for each 的其他地方复制一个 for in (不会抛出错误),但它仍然会标记它。
  • 好吧,除了 Firefox 浏览器没有 for each 循环。只有for…infor 循环。我也不使用 DW,可能是编辑器本身有问题——或者,您编写的实际代码不正确。您可以使用jsfiddle.netpastebin.com 或类似的方法提供更多实际 问题的代码。
【解决方案2】:

我会说缓存分割结果

for(var objindex=0; objindex<OS.numberofobjects; ++objindex){
   var splits = speed_x_set[objindex].split(","); //Cache the split so its does not need to be done twice
   OS.speed_x_on_set[objindex] = splits[0];
   OS.speed_x_off_set[objindex] = splits[1];
   ...
};

【讨论】:

  • 我为什么要缓存结果?我不确定我是否遵循,但循环将 1) 命中 object1,2) 进入包含输入的所有速度值的 speed_x_set 3) 找到正确的速度值(看起来像“1000,1000”对于“in ,out") 4) 拆分值并将第一个值分配给 OS.speed_x_on_set 并将第二个值分配给 OS.speed_x_off_set .....如何正确缓存结果?谢谢!
  • @Aaron:在你的代码中你做了两次speed_x_set[objindex].split(",")。 IE。它必须查找speed_x_set[objindex] 并将字符串拆分两次,而不是在@Starx 的代码中只拆分一次。这是您可以做的唯一改进(没有关于整体问题的更多信息)。
【解决方案3】:

您要查找的内容称为parallel assignment,但不幸的是,JavaScript 没有它。

然而,在 ruby​​ 中,通常会看到类似的模式:

first, second = "first second".split

正如其他人所指出的,显而易见的方法是缓存拆分结果并单独分配它们。很抱歉没有直接回答您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-16
    • 2019-09-12
    • 2020-05-09
    • 1970-01-01
    • 2012-08-29
    • 2017-01-30
    • 1970-01-01
    • 2020-06-05
    相关资源
    最近更新 更多