VVK
VVK

Reputation: 445

JavaScript: Interpolate certain values in float array

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

Answers (1)

Nina Scholz
Nina Scholz

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

Related Questions