2011-03-02 71 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