Javascript-如何按特定的排序顺序混合两个对象数组?

时间:2018-07-13 17:03:51

标签: javascript arrays sorting

我有两个对象数组。像这样:

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;
}

3 个答案:

答案 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);