2012-03-11 35 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