转换2名/值对象的数组键一个名称/值

问题描述:

当使用jQuery的窗体上的serializeArray()我得到一个数组,看起来像这样:转换2名/值对象的数组键一个名称/值

[{ 
    "name": "name", 
    "value": "1_filename.jpg" 
}, { 
    "name": "caption", 
    "value": "1_caption" 
}, { 
    "name": "name", 
    "value": "2_filename.jpg" 
}, { 
    "name": "caption", 
    "value": "2_caption" 
}, { 
    "name": "name", 
    "value": "3_filename.jpg" 
}, { 
    "name": "caption", 
    "value": "3_caption" 
}, { 
    "name": "name", 
    "value": "4_filename.jpg" 
}, { 
    "name": "caption", 
    "value": "4_caption" 
}] 

但我的代码的其余部分预计的东西更多这样的:

[{ 
    "name": "1_filename.jpg", 
    "caption": "1_caption" 
}, { 
    "name": "2_filename.jpg", 
    "caption": "2_caption" 
}, { 
    "name": "3_filename.jpg", 
    "caption": "3_caption" 
}, { 
    "name": "4_filename.jpg", 
    "caption": "4_caption" 
}] 

我是新来操纵数组和对象这样的,我不知道是否已经有是所使用的第一个转换为类似第二个例子东西的约定。

我的第一个猜测是迭代2并将它们推送到一个新的对象。我试着迭代一个并检查名字,但我遇到了一些麻烦,确保名称和标题保持正确。

var output = []; 
for (var i = 0; i < input.length; i += 2) { 
    output.push({ name: input[i].value, caption: input[i + 1].value }); 
} 

Working example

这显然是僵硬的附带条件的假设,对象的顺序将nameN:

+0

怎么看起来像之前的原始数据你调用'serializeArray()'? –

你可以用一个环路遍历数组的所有其他元素实现这一目标,captionN,nameN + 1,captionN + 1 ...

如果这种假设不正确,您需要实现自己的sort()逻辑,在创建新的阵列之前将输入数据置于正确的格式年。

+0

感谢您的支持!最后,我发现这个版本更容易阅读。 – Dustin

环路由两个,建立一个对象,设置名称和值到obj的两个指标,并推对象到数组

var arr = [{ 
 
    "name": "name", 
 
    "value": "1_filename.jpg" 
 
}, { 
 
    "name": "caption", 
 
    "value": "1_caption" 
 
}, { 
 
    "name": "name", 
 
    "value": "2_filename.jpg" 
 
}, { 
 
    "name": "caption", 
 
    "value": "2_caption" 
 
}, { 
 
    "name": "name", 
 
    "value": "3_filename.jpg" 
 
}, { 
 
    "name": "caption", 
 
    "value": "3_caption" 
 
}, { 
 
    "name": "name", 
 
    "value": "4_filename.jpg" 
 
}, { 
 
    "name": "caption", 
 
    "value": "4_caption" 
 
}]; 
 

 
var out = []; 
 
for(var i=0; i<arr.length; i+=2){ 
 
    var obj = {}; 
 
    obj[arr[i].name] = arr[i].value; 
 
    obj[arr[i+1].name] = arr[i+1].value; 
 
    out.push(obj); 
 
} 
 
console.log(out);