Reputation: 445
let floats = [6, 10, 10, 10, 20, 48, 50.5, 60, 60, 78, 90];
let evens = [{}];
for(let i = 0; i < floats.length; i++){
if(floats[i] == floats[i - 1]) { evens[evens.length - 1][i - 1] = floats[i - 1], evens[evens.length - 1][i] = floats[i]; }
else { evens.push({}); }
}
evens = evens.filter(value => JSON.stringify(value) !== '{}');
evens.forEach(d_ =>{
let indices = Object.keys(d_);
let offset = 1;
let predecessor = Number(indices[0]) - 1;
let successor = Number(indices[indices.length - 1]) + 1;
if(predecessor < 0) { predecessor = 0; offset = 2; }
if(successor > floats.length - 1) { successor = floats.length - 1; offset = 0; }
let steps = (floats[successor] - floats[predecessor]) / (indices.length + offset);
indices.forEach((d2_, i_) => { floats[d2_] = floats[predecessor] + steps * (i_ + 1); })
})
console.log(floats);
Let's say, I have an arbitrary float array:
var floats = [6.0, 10.1, 10.1, 10.1, 20.0, 32.0, 41.0, 50.5, 60.0, 60.0, 78.0];
Is there an easy way to modify it in a way that sequence of even numbers [10.1, 60.0] would interpolate between their predecessor and successor?
[6.0, 9.5, 13.0, 16.5, 20.0, 32.0, 41.0, 50.5, 59.6666, 68.8333, 78.0]
10.1, 10.1, 10.1 > 9.5, 13.0, 16.5
60.0, 60.0 > 59.6666, 68.8333
Upvotes: 1
Views: 157
Reputation: 386728
You could take a closure over a value and the offset which are used to generate an interpolation between non repeating values.
let floats = [6, 10, 10, 10, 20, 48, 50.5, 60, 60, 78, 90],
result = floats.map(((value, offset) => (v, i, a) => {
if (a[i - 1] !== v && v !== a[i + 1]) {
value = undefined;
return v;
}
if (value === undefined) {
let n = 1;
value = a[i - 1];
while (v === a[i + ++n]);
offset = (a[i + n] - value) / (n + 1);
}
return value += offset;
})());
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Upvotes: 1