2011-03-02 70 views
3

考慮到任何物體與成員是這樣的:加入Javascript對象成員?

target 
{ 
    x1 : 1 
    x2 : 2 
    x3 : 3 
    y1 : 6 
    y2 : 5 
    y3 : 4 
} 

我需要將對象轉換爲這樣的事情:

target 
{ 
    x : [1, 2, 3] 
    y : [6, 5, 4] 
} 

從基本的JavaScript我知道,好像下面的函數將工作:

function joinParameters(target, paramName) { 
    var count = 1; 
    var array = []; 
    var name = paramName.concat(count); 
    var value = target[name]; 
    while (typeof value != undefined) { 
     array.push(value); 
     name = paramName.concat(count); 
    } 
    target[paramName] = array; 
} 

所以,我可以說joinParameters(target,「x」);然而問題是,

var value = target[name]; 

始終未定義。我遵循FireBug中的代碼來確保目標對象具有我想要獲取的屬性,並且它具有。所以,我不太確定有什麼問題。

如果jQuery有這樣做的優雅方式,那麼我寧願那個解決方案。

+1

您的意思是使用'.join'而不是'.concat'? '.concat'將返回一個數組,'.join'將返回一個字符串。 – NT3RP 2011-03-02 01:42:37

+0

我認爲他的意思是實際上做一個substr ..因爲paramName是一個字符串 – zachallia 2011-03-02 01:45:04

+0

該String對象也有一個concat方法。當我單步執行代碼時,它確實正確地連接了字符串。 ref:http://www.w3schools.com/jsref/jsref_concat_string.asp – Tedderz 2011-03-02 01:51:48

回答

3

使用underscore.js:

_(target).keys().reduce(function(memo, key){ 
    var split = /([^\d]+)([\d]+)/.exec(key); 
    memo[split[1]] = memo[split[1]]||[]; 
    memo[split[1]][parseInt(split[2],10)-1] = target[key]; 
    return memo; 
},{}); 

工作例如:

http://jsfiddle.net/PLgN5/

+0

謝謝,大衛。我很感謝你的回答以及你的有用評論。接受答案。 – Tedderz 2011-03-02 03:13:10

2

你可以這樣做:

function joinParams(o) { 
    var ret = {}, 
     key; 
    for(var i in o) { 
     key = i.substr(0,1); 
     ret[key] = ret[key] ? ret[key].push(o[i]) && ret[key] : [o[i]]; 
    } 
    return ret; 
} 


var target = /* original object */ 
target = joinParams(target); 
3
function joinParams(target) { 
    var p; 

    for (prop in target) { 
     p = prop.substr(0, 1); 

     if (!target[p]) { 
       target[p] = []; 
     } 

     target[p].push(target[prop]); 
    } 

    return target; 
} 

target = 
{ 
    x1 : 1, 
    x2 : 2, 
    x3 : 3, 
    y1 : 6, 
    y2 : 5, 
    y3 : 4 
} 

target = joinParams(target); 
+0

是的,這比我的第一次嘗試更清潔。 ha – zachallia 2011-03-02 02:05:55

1

,我們在您ORI一些邏輯錯誤代碼(即無限循環)。修復:

 
function joinParameters(target, paramName) { 
    var count = 1; 
    var array = []; 
    var name = paramName.concat(count); 
    var value = target[name]; 
    while (value != undefined) { /* typeof value will return "undefined". */ 
     array.push(value); 
     /* You need to increment 'count'. */ 
     name = paramName.concat(++count); 
     value = target[name]; 
    } 
    target[paramName] = array; 
} 

... 

joinParameters(target, "x"); 

注意調用該函數將新元素添加到xtargetx1, x2, ..., x6仍然會存在target。實際上,這個函數並不關心y元素,我假設你也想「加入」元素。

對於更通用的功能,zachallia的答案應該有所斬斷。

+0

呃,是的,我應該已經看到了......我只通過FireBug中的代碼的第一部分,並想知道失敗的情況。謝謝! – Tedderz 2011-03-02 02:30:46