我有两个对象数组。像这样:
var arrayA = [
{
type: 'card',
id: 1
},
{
type: 'card',
id: 2
},
{
type: 'card',
id: 3
},
{
type: 'card',
id: 4
},
{
type: 'card',
id: 5
},
];
var arrayB = [
{
type: 'pro-tip',
id: 10
},
{
type: 'pro-tip',
id: 11
},
];
我想合并这两个对象数组,但要按特定顺序进行。基本上,我想要的是,在arrayA
中每N个元素之后,我要在arrayB
中添加一个元素。如果N == 2
的最终数组如下所示:
var finalArray = [
{
type: 'card',
id: 1
},
{
type: 'card',
id: 2
},
{
type: 'pro-tip',
id: 10
},
{
type: 'card',
id: 3
},
{
type: 'card',
id: 4
},
{
type: 'pro-tip',
id: 11
},
{
type: 'card',
id: 5
},
];
也许做这样的事情并不难,但是我正在寻找构建辅助函数的最优雅的方法。
编辑:
这是我创建的功能。看起来似乎可行,但是可能有一种更简单的方法:
function mergeWithSteps( arrayA, arrayB, nSteps, nElementsToAdd ) {
var finalArray = [],
stepsCount = 0,
elementsToAddCount = 0,
arrayBNumberOfElements = arrayB.length;
arrayA.forEach( function( obj ) {
finalArray.push( obj );
stepsCount++;
if( stepsCount == nSteps && elementsToAddCount < arrayBNumberOfElements ) {
finalArray.push( arrayB[ elementsToAddCount ] );
elementsToAddCount++;
stepsCount = 0;
}
} );
return finalArray;
}
答案 0 :(得分:3)
您可以使用Array#slice
插入想要的项目,并从头开始遍历arrayB
,因为每个拼接都会在插入索引之后更改索引。
var arrayA = [{ type: 'card', id: 1 }, { type: 'card', id: 2 }, { type: 'card', id: 3 }, { type: 'card', id: 4 }, { type: 'card', id: 5 }],
arrayB = [{ type: 'pro-tip', id: 10 }, { type: 'pro-tip', id: 11 }],
place = 2,
i = arrayB.length;
while (i) {
arrayA.splice(i * place, 0, arrayB[--i]);
}
console.log(arrayA);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:0)
这是我使用for
的迭代解决方案
countA = arrayA.length;
countB = arrayB.length;
merged = [];
for (var i = 0, j = 0, m = 0; i < countA; i ++, m ++) {
if (i > 0 && i%2 == 0 && typeof arrayB[j] !== 'undefined') {
merged[m] = arrayB[j];
j ++;
m ++;
}
merged[m] = arrayA[i];
}
// if you'd like to place all remaining arrayB elements after arrayA is exhausted
if (countB > j) {
for (i = j; i < countB; i++, m ++) {
merged[m] = arrayB[i];
}
}
答案 2 :(得分:0)
如果不修改初始数组,则可以使用reduce
。
const arrayA = [
{
type: 'card',
id: 1
},
{
type: 'card',
id: 2
},
{
type: 'card',
id: 3
},
{
type: 'card',
id: 4
},
{
type: 'card',
id: 5
},
];
const arrayB = [
{
type: 'pro-tip',
id: 10
},
{
type: 'pro-tip',
id: 11
},
];
const res = arrayA.reduce((acc, a, i) => {
const b = arrayB[(i + 1) / 2 - 1];
return [...acc, a, ...(b ? [b] : [])];
}, []);
console.log(res);