Javascript - Как смешивать два массива объектов с определенным порядком сортировки?

На самом деле, версии стандарта C ++ до того, как C ++ 11 определили ключевое слово «export», [] , можно просто объявить шаблоны в файле заголовка и реализовать их в другом месте.

К сожалению, ни один из популярных компиляторов не реализовал это ключевое слово. Единственный, о котором я знаю, - это интерфейс, написанный Edison Design Group, который используется компилятором Comeau C ++. Все остальные настаивали на том, что вы пишете шаблоны в заголовочных файлах, нуждающихся в определении кода для надлежащего создания экземпляра (как уже указывали другие).

В результате стандартная комиссия ISO C ++ решила удалить export особенность шаблонов, начинающихся с C ++ 11.

0
задан Diego de Oliveira 13 July 2018 в 17:20
поделиться

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

3
ответ дан Nina Scholz 17 August 2018 в 12:22
поделиться
  • 1
    Ницца! Я полностью забыл, что вы можете добавлять элементы с array.splice. – Diego de Oliveira 13 July 2018 в 17:24
  • 2
    Я думаю, что ваше решение - лучшая, почти одна строка с array.splice. Я решил использовать это решение, и я планирую сделать его более гибким в будущем. Благодаря! – Diego de Oliveira 13 July 2018 в 20:09

Вы можете использовать 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);

0
ответ дан Hikmat G. 17 August 2018 в 12:22
поделиться

Вот мое итерационное решение, использующее 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];
    }
}
0
ответ дан Seva Kalashnikov 17 August 2018 в 12:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: