给定任何具有如下成员的对象:
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有一种优雅的方式,那么我更喜欢这个解决方案。
答案 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;
},{});
工作示例:
答案 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
添加新元素target
,x1, x2, ..., x6
中仍会存在target
。实际上,这个函数不处理y
元素,我假设你也想要“加入”。
对于更通用的功能, zachallia 的答案应该可以解决问题。