连接Javascript对象成员?
给定任何成员如下所示的对象:连接Javascript对象成员?,javascript,jquery,Javascript,Jquery,给定任何成员如下所示的对象: target { x1 : 1 x2 : 2 x3 : 3 y1 : 6 y2 : 5 y3 : 4 } target { x : [1, 2, 3] y : [6, 5, 4] } 我需要将对象转换为如下内容: target { x1 : 1 x2 : 2 x3 : 3 y1 : 6 y2 : 5 y3 : 4 } target { x :
target
{
x1 : 1
x2 : 2
x3 : 3
y1 : 6
y2 : 5
y3 : 4
}
target
{
x : [1, 2, 3]
y : [6, 5, 4]
}
我需要将对象转换为如下内容:
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有一种优雅的方法来实现这一点,那么我更喜欢这种解决方案。您可以:
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);
使用下划线.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;
},{});
工作示例:
原始代码中存在一些逻辑错误(即无限循环)。修正: 函数joinParameters(目标、参数名){ var计数=1; var数组=[]; var name=paramName.concat(计数); var值=目标[名称]; 而(value!=undefined){/*typeof值将返回“undefined”*/ array.push(值); /*您需要递增“count”*/ name=paramName.concat(++count); 值=目标[名称]; } 目标[paramName]=数组; } ... 联合参数(目标,“x”); 注意:此函数调用将向
target
添加新元素x
,x1、x2、…、x6
仍将存在于target
中。事实上,这个函数不处理y
元素,我假设您也想“加入”它
对于一个更通用的函数,zachallia的答案应该可以做到这一点。你的意思是使用
.join
而不是.concat
.concat
将返回一个数组,.join
将返回一个字符串。我想他实际上是想做一个substr。。因为paramName是stringname,所以String对象也有一个concat方法。当我单步执行代码时,它确实正确地连接了字符串。参考:w3schools有很多误导性和不正确的信息,最好不要将其用作参考。参考资料在这里:但有点难读。Mozilla通常都很好:啊,是的,我应该看到。。。我只是在FireBug中逐步浏览了代码的第一部分,并对失败的情况感到疑惑。谢谢谢谢,大卫。我感谢你的回答以及你有益的评论。答案被接受。