Raul Rodriguez - 3 years ago 58

Javascript Question

I have 3 numbers in an array that I want to order so that the item closest to 2 is in the middle, the lowest from two on the left and the highest from two on the right.

example 1 -

`[2.3, 5.2, 1.2];`

`[1.2, 2.3, 5.2];`

example 2 -

`[1.1, 2.3, 0.3];`

`[0.3, 2.3, 1.1];`

example 3 -

`[1.3, 0.3, 2];`

`[0.3, 2, 1.3];`

example 4 -

`[2.2, 2.3, 2.1];`

`[2.2, 2.1, 2.3];`

Currently I have the following but this is not ordering correctly. This puts the item closest to 2 at the front.

`arr.sort(function(a, b){`

return Math.abs(1 - (a - 2)) - Math.abs(1 - (b - 2));

});

Can anyone see how this needs to be changed?

Recommended for you: Get network issues from **WhatsUp Gold**. **Not end users.**

Answer Source

You need a three step approach, first sort to get the closest to the given value, shift that value and sort the rest ascending. Then plice the temporary value to index `1`

.

```
function sort(array) {
var temp = array.sort((a, b) => Math.abs(x - a) - Math.abs(x - b)).shift();
array.sort((a, b) => a - b).splice(1, 0, temp);
return array;
}
var x = 2;
console.log(sort([0, 1, 2]));
console.log(sort([1, 2, 3]));
console.log(sort([2, 3, 4]));
```

`.as-console-wrapper { max-height: 100% !important; top: 0; }`

Another solution would be to collect the values with bigger delta in a new array and sort it. Later put the reduced value back to index `1`

.

Advantage: No superfluous sort, while only one iteration is needed.

```
function sort(array) {
var temp = [],
value = array.reduce((a, b) =>
Math.abs(x - a) < Math.abs(x - b) ? (temp.push(b), a) : (temp.push(a), b)
);
temp.sort((a, b) => a - b).splice(1, 0, value);
return temp;
}
var x = 2;
console.log(sort([0, 1, 2]));
console.log(sort([1, 2, 3]));
console.log(sort([2, 3, 4]));
```

`.as-console-wrapper { max-height: 100% !important; top: 0; }`

Recommended from our users: **Dynamic Network Monitoring from WhatsUp Gold from IPSwitch**. ** Free Download**