2014-11-17 51 views
0

具有對象的下面陣列:對象迭代語法

obj = [ 
    column: 
    label: "Name" 
    value: "name" 
    operator: 
    label: "Greater than" 
    value: "_greater_than" 
    input_value: "foo" 
    ... ] 

然後我可以構造另一個對象作爲URL PARAM使用像這樣:

query = {} 
angular.forEach(obj, (k, v) -> 
    query = ["c[" + k.column.value + k.operator.value + "]=" + k.input_value] 
) 

此返回是這樣的:

[「c [name_greater_than] = foo」]

雖然這是做什麼的意思,我覺得這個代碼有點(很?)髒,所以有沒有辦法讓這條線更優雅或高效?

query = ["c[" + k.column.value + k.operator.value + "]=" + k.value] 
+1

這不是JSON,JSON是*字符串格式,可以將JavaScript對象編碼爲字符串。 –

+0

什麼是'angular.forEach'在那裏? 'obj'實際上是這樣的對象的數組嗎? – Bergi

+0

@Bergi yup obj是一個類似於obj的對象數組,道歉 – Jax

回答

0

angular.forEach調用不會,原因有兩個意義:

  1. obj僅顯示爲一個單一的對象,因此沒有什麼可迭代器來。
  2. angular.forEach在迭代對象時傳遞迴調鍵之前的值,但參數是(k, v)

基於此,我猜obj實際上是一個對象的數組,看起來像您的問題的頂部obj

在這種情況下,你可以使用一個簡單的循環:

query = { } 
for e in objs 
    query["#{e.column.value}#{e.operator.value}"] = e.value 

或者如果query = { }冒犯您,使用reduce

query = objs.reduce(
    (q, e) -> q["#{e.column.value}#{e.operator.value}"] = e.value; q 
    { } 
) 

您可能希望它這樣寫:

query = objs.reduce(
    (q, e) -> 
    q["#{e.column.value}#{e.operator.value}"] = e.value 
    q 
    { } 
) 

如果您不習慣於仔細關注reduce回調的返回值。

+0

當然,就像你在答案中提出的第一個選項,道歉不清楚在描述數組時足夠了(問題已經更新以反映這一點),您的解決方案既優雅又高效,歡呼。 – Jax