将包含2个名称/值对象键的数组转换为单个名称/值

时间:2016-03-31 20:37:58

标签: jquery arrays json object

在我的表单上使用jQuery' serializeArray()时,我得到一个如下所示的数组:

[{
  "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并将它们推送到一个新对象。我已经尝试过迭代并检查名称,但是我确定名称和标题在一起时遇到了一些问题。

2 个答案:

答案 0 :(得分:1)

你可以用一个循环来实现这个目的,它循环遍历数组的每个其他元素:

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,captionN,nameN + 1,captionN + 1 ......

如果这个假设不正确,您需要实现自己的sort()逻辑,以便在创建新数组之前将输入数据放入正确的格式。

答案 1 :(得分:1)

循环两次,构建一个对象,将名称和值设置为两个索引的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);