JSFiddle - React, Tailwind, and code Playground
JavaScript
var original = [{
type: 'image',
name: 'foo image',
src: 'http://www.something.com/path/to/image.jpg',
text: "lorem ipsum sit amet"
}, {
type: 'video',
name: 'foo video',
src: 'http://www.something.com/path/to/video.mp4',
text: "lorem ipsum sit amet"
}, {
type: 'text',
name: 'foo text',
src: '',
text: "lorem ipsum sit amet"
}, {
type: 'video',
name: 'foo video',
src: 'http://www.something.com/path/to/video.mp4',
text: "lorem ipsum sit amet"
}, {
type: 'text',
name: 'foo text',
src: '',
text: "lorem ipsum sit amet"
}, {
type: 'image',
name: 'foo image',
src: 'http://www.something.com/path/to/image.jpg',
text: "lorem ipsum sit amet"
}, {
type: 'text',
name: 'foo text',
src: '',
text: "lorem ipsum sit amet"
}, {
type: 'video',
name: 'foo video',
src: 'http://www.something.com/path/to/video.mp4',
text: "lorem ipsum sit amet"
}, {
type: 'text',
name: 'foo text',
src: '',
text: "lorem ipsum sit amet"
}];
// agrupar por chaves
var tipos = original.reduce(function(obj, entrada) {
if (!obj[entrada.type]) obj[entrada.type] = [];
obj[entrada.type].push(entrada);
return obj;
}, {});
// intercalar
var resultado = Object.keys(tipos).reduce(function(arr, tipo, i, _tipos){
let entrada, pos = 0 + i, qtd = _tipos.length;
while (entrada = tipos[tipo].shift()){
arr[pos] = entrada || null;
pos+= qtd;
}
return arr;
}, []).filter(Boolean);
alert(JSON.stringify(resultado, null, 4))