将一个数组中连续的对象组合成一个新的数组

Combine consecutive objects in an array to form a new array

这是我的示例数组。数组长度可以是 n

[{
"name": "question",
"value": "this is a first question"
},
{
"name": "answer",
"value": "this is a frist answer"
},
{
"name": "question",
"value": "this is a second question"
},
{
"name": "answer",
"value": "this is a second answer"
}
]

我想通过组合两个连续的对象得到以下输出。

[{"question":"This is first question", "answer":"This is first answer"}, {"question":"This is second question", "answer":"This is second answer"}]

我的 javascript 应该怎么做才能达到同样的效果?我在过去 2 天被困在这里

你可以尝试类似的东西:

let data = [{
"name": "question",
"value": "this is a first question"
},
{
"name": "answer",
"value": "this is a frist answer"
},
{
"name": "question",
"value": "this is a second question"
},
{
"name": "answer",
"value": "this is a second answer"
}
];

let newData = [];
for(let i=0,l=data.length;i<l;i=i+2) {
  newData.push({
    question:data[i].value,
    answer: (data[i+1]||{}).value
  });
}

console.log(newData);

使用map()filter()方法将数组转换为two-element sub-arrays,然后使用[=15=将sub-arrays转换为对象]方法。

const exam = [{
        "name": "question",
        "value": "this is a first question"
    },
    {
        "name": "answer",
        "value": "this is a frist answer"
    },
    {
        "name": "question",
        "value": "this is a second question"
    },
    {
        "name": "answer",
        "value": "this is a second answer"
    }
];

const newExam = exam
//map each odd element to a two-element sub-array; even []
.map((q,i,a) => i % 2 === 0 ? [q,a[i+1]] : [])
//filter out []
.filter(q => q.length)
//convert each sub-array into an object
.map( q => q.reduce((qn,{name,value}) => ({...qn,[name]:value}), {}) );

console.log( newExam );

使用 reduce() 代替 map()filter()

const exam = [{
        "name": "question",
        "value": "this is a first question"
    },
    {
        "name": "answer",
        "value": "this is a frist answer"
    },
    {
        "name": "question",
        "value": "this is a second question"
    },
    {
        "name": "answer",
        "value": "this is a second answer"
    }
];

const newExam = exam
//convert array into two-element sub-arrays
.reduce((ex,q,i,a) => i % 2 === 0 ? [...ex,[q,a[i+1]]] : ex, [])
//convert each sub-array into an object
.map( q => q.reduce((qn,{name,value}) => ({...qn,[name]:value}), {}) );

console.log( newExam );

仅使用 reduce()

const exam = [{
        "name": "question",
        "value": "this is a first question"
    },
    {
        "name": "answer",
        "value": "this is a frist answer"
    },
    {
        "name": "question",
        "value": "this is a second question"
    },
    {
        "name": "answer",
        "value": "this is a second answer"
    }
];

const newExam = exam
.reduce(
    (ex,{name,value},i,a) => 
    i % 2 === 0 ? [...ex,{[name]:value,[a[i+1].name]:a[i+1].value}] : ex, []
);

console.log( newExam );