2012-03-11 33 views
1

我有一个for循环遍历用户创建的元素数量。这个插件中有很多可用的设置,并且每个元素都可以接收它的特定设置。更好的方式分裂和分配Javascript中的许多值?

  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 “如上所示添加。希望这提供了足够的信息。谢谢!

+3

我会先将'speed_x_set [objindex] .split(“,”)'赋值给变量,以避免将值分割两次。 – 2012-03-11 17:35:58

+1

使用'i'作为你的循环变量也有助于视觉噪音。 – sdolan 2012-03-11 17:37:18

+0

Upvote for使用我作为循环中的迭代器变量。它真的有助于阅读:) – 2012-03-11 17:44:07

回答

1

我想说缓存分割结果

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]; 
    ... 
}; 
+0

我为什么要缓存结果?我不确定我是否遵循,但循环将1)碰到object1,2)进入speed_x_set,其中包含所有输入的速度值3)找到正确的速度值(它看起来像“1000,1000”for“in ,out))4)分割值并将第一个值分配给OS.speed_x_on_set,将第二个值分配给OS.speed_x_off_set .....如何将结果缓存到这个正确的位置?谢谢! – Aaron 2012-03-11 18:03:23

+2

@Aaron:在你的代码中,你正在执行'speed_x_set [objindex] .split(“,”)'两次。即它必须查找'speed_x_set [objindex]'并且将字符串分割两次,而不是在@Starx'代码中只分割一次。这是你可以做的唯一改进(没有关于整体问题的更多信息)。 – 2012-03-11 18:06:25

0

你在找什么叫parallel assignment,但不幸的是,JavaScript没有它。

在Ruby中,但是,它是经常可以看到类似的模式:

first, second = "first second".split 

正如其他人所指出的,明显的方法是将缓存拆分结果,并分别为它们分配。对不起,没有直接回答你的问题。

2

我会避免访问相同的项目两次,并执行相同的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(火狐),你可以简单地有:

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中的下一个版本

并希望为好。它被称为“解构赋值”。

+0

Awww,这真棒,有道理,谢谢!但问题是我有大约60个设置,所以实际的循环代码很长。尽管他们都在做同样的事情。例如:用户可以在3个对象上设置speed_x,如下所示:speed_x:“1000,500> 1000,500> 200,500”。前两个对象的speed_x_in为1000,speed_x_out为500.第三个对象的speed_x_in为200和500.它们首先被对象(>)分成speed_x_set(所以我有speed_x_set = index 1:1000,500 ,索引2:1000,500 ...等等,从那里我需要用逗号分割,并推入OS.speed_x_set。 – Aaron 2012-03-11 18:24:40

+0

我发布的代码工作得很好,只是看起来像一吨代码,所以,我也有例如delay_x(写的方式完全相同)我不知道如何完成这个......谢谢! – Aaron 2012-03-11 18:25:20

+0

不知道我关注你,我应该看看实际的代码,但是,你已经可以减少一些代码只做一个分割:'values = speed_x.split(/,|> /);'然后你有一个包含所有值的数组,你知道它们是成对的,你可以迭代它们。迭代它们:假设你有'MyValues = {}; MyValues.speed_x =“...”; MyValues.speed_y =“...”;'你可以拥有:'for(var prop在MyValues中)doSomething(MyValues [prop])';类似的东西。 – ZER0 2012-03-11 18:35:40