array-rearrange
Version:
Rearrange array elements by index array
68 lines (48 loc) • 1.55 kB
JavaScript
module.exports = reorder
function reorder(arr, index, stride) {
var n = index.length
if (!stride) {
stride = Math.floor(arr.length / index.length);
}
if (arr.length !== n * stride) {
throw Error('Bad length of index array')
}
if (stride === 1) {
reorderSimple()
}
else {
reorderStride(stride)
}
function reorderSimple () {
for (var start = 0; start < n; start++) {
var currId, pickId = index[start]
if (start === pickId) continue
while (pickId !== start) {
currId = pickId
pickId = index[currId]
var v = arr[pickId]
arr[pickId] = arr[currId]
arr[currId] = v
index[currId] = currId
}
}
}
function reorderStride (stride) {
for (var start = 0; start < n; start++) {
var currId, pickId = index[start]
if (start === pickId) continue
while (pickId !== start) {
currId = pickId
pickId = index[currId]
for (var j = 0; j < stride; j++) {
var value = arr[pickId * stride + j];
arr[pickId * stride + j] = arr[currId * stride + j];
arr[currId * stride + j] = value;
}
index[currId] = currId
}
}
}
return arr
}