есть массив индексов [0, 3, 1, empty, 2]
<...>
должно быть - [100, 400, 200, empty, 300]
Что, вот прям так - empty? Ну, держите:
for (let i = 0; i < indexes.length; i++) {
if (indexes.hasOwnProperty(i)) {
arr.push(arr[indexes[i]]);
} else {
arr.length++;
}
}
arr.splice(0, arr.length - indexes.length);
Если отказаться от этого идиотизма с empty (пусть в массиве индексов будет что-то не числовое, null например; а в исходный массив подставляться будет undefiend, соответственно), то
arr.splice(0, arr.length, ...indexes.map(i => arr[i]));