加入Javascript对象成员?

时间:2011-03-02 01:31:32

标签: javascript jquery

给定任何具有如下成员的对象:

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有一种优雅的方式,那么我更喜欢这个解决方案。

4 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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/

答案 2 :(得分: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 :(得分:1)

原始代码中存在一些逻辑错误(即无限循环)。修正:

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");

请注意,此函数调用会向x添加新元素targetx1, x2, ..., x6中仍会存在target。实际上,这个函数不处理y元素,我假设你也想要“加入”。

对于更通用的功能, zachallia 的答案应该可以解决问题。