将一个数组中连续的对象组合成一个新的数组
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 );
这是我的示例数组。数组长度可以是 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 );