Javascript 对一个数组进行排序,其中项目最接近中间的两个极端,另一侧的其他极端-js 我在一个数组中有3个数字,我要排序,以便最接近2的项在中间,最低的从左边的两个,最高的从右边的两个。

Javascript 对一个数组进行排序,其中项目最接近中间的两个极端,另一侧的其他极端-js 我在一个数组中有3个数字,我要排序,以便最接近2的项在中间,最低的从左边的两个,最高的从右边的两个。,javascript,ecmascript-6,Javascript,Ecmascript 6,示例1-[2.3、5.2、1.2]应更改为[1.2,2.3,5.2] 示例2-[1.1、2.3、0.3]应更改为[0.3,2.3,1.1] 示例3-[1.3,0.3,2]应更改为[0.3,2,1.3] 示例4-[2.2,2.3,2.1]应更改为[2.2,2.1,2.3] 目前我有以下产品,但订购不正确。这会将最接近2的项目放在前面 arr.sort(function(a, b){ return Math.abs(1 - (a - 2)) - Math.abs(1 - (b - 2));

示例1-
[2.3、5.2、1.2]应更改为
[1.2,2.3,5.2]

示例2-
[1.1、2.3、0.3]应更改为
[0.3,2.3,1.1]

示例3-
[1.3,0.3,2]应更改为
[0.3,2,1.3]

示例4-
[2.2,2.3,2.1]应更改为
[2.2,2.1,2.3]

目前我有以下产品,但订购不正确。这会将最接近2的项目放在前面

arr.sort(function(a, b){
    return Math.abs(1 - (a - 2)) - Math.abs(1 - (b - 2));
});

有人知道该如何更改吗?

要简单,请将距离排序为2,然后将第一个放在第二个位置:

arr.sort((a,b)=>Math.abs(a-2)-Math.abs(b-2));

arr=[arr[1],arr[0],arr[2]];

要轻松,请在距离为2后排序,然后将第一个放在第二个位置:

arr.sort((a,b)=>Math.abs(a-2)-Math.abs(b-2));

arr=[arr[1],arr[0],arr[2]];

您需要一个三步方法,首先排序以获得最接近给定值的值,移动该值,然后将其余值升序排序。然后将临时值应用于索引
1

函数排序(数组){
var temp=array.sort((a,b)=>Math.abs(x-a)-Math.abs(x-b)).shift();
数组.sort((a,b)=>a-b).splice(1,0,temp);
返回数组;
}
var x=2;
log(排序([0,1,2]);
log(排序([1,2,3]);
log(排序([2,3,4])

.as console wrapper{max height:100%!important;top:0;}
您需要一种三步方法,首先排序以获得最接近给定值的值,移动该值,然后将其余值升序排序。然后将临时值应用于索引
1

函数排序(数组){
var temp=array.sort((a,b)=>Math.abs(x-a)-Math.abs(x-b)).shift();
数组.sort((a,b)=>a-b).splice(1,0,temp);
返回数组;
}
var x=2;
log(排序([0,1,2]);
log(排序([1,2,3]);
log(排序([2,3,4])

。作为控制台包装{max height:100%!important;top:0;}
您可以使用一个具有直接规则的减速器来完成

const diff=value=>Math.abs(值-2)
const sort=arr=>arr.reduce([min,closest,max],value)=>{
如果(最近的!==最近的| |差异(值)max)max=value
返回值[最小值、最近值、最大值]
},新阵列(3)。填充(NaN))
常数测试=[
[2.3, 5.2, 1.2],
[1.1, 2.3, 0.3],
[1.3, 0.3, 2],
[2.2, 2.3, 2.1] 
]

tests.forEach(test=>console.log(`[${test.join(',')}]-->[${sort(test.join(',')}]`))
您可以使用一个具有直接规则的减速机来完成

const diff=value=>Math.abs(值-2)
const sort=arr=>arr.reduce([min,closest,max],value)=>{
如果(最近的!==最近的| |差异(值)max)max=value
返回值[最小值、最近值、最大值]
},新阵列(3)。填充(NaN))
常数测试=[
[2.3, 5.2, 1.2],
[1.1, 2.3, 0.3],
[1.3, 0.3, 2],
[2.2, 2.3, 2.1] 
]

tests.forEach(test=>console.log(`[${test.join(',')}]-->[${sort(test.join(',')}]`))
您的描述听起来像是希望它们按从低到高的顺序排列。如果我读错了,请提供一个他们不会那样排序的例子。更新的问题和更多的例子如果你有3个数字,为什么还要麻烦使用
sort
?你的数学:
math.abs(1-(a-1))-math.abs(1-(b-1))
相当于
math.abs(a)-math.abs(b)
@YuryTarabanko我认为这是解决这个问题的最好办法。如果有更好的方式,我很乐意听到你的描述,听起来你只是想让他们从最低到最高的顺序。如果我读错了,请提供一个他们不会那样排序的例子。更新的问题和更多的例子如果你有3个数字,为什么还要麻烦使用
sort
?你的数学:
math.abs(1-(a-1))-math.abs(1-(b-1))
相当于
math.abs(a)-math.abs(b)
@YuryTarabanko我认为这是解决这个问题的最好办法。如果有更好的方法,我很想听到它不,这还不够,因为你使用的是相同的绝对增量,这最终不是正确的排序顺序。@nina scholz如果OP真的检查了他的测试用例,我就不太懂舒尔了。。。然而,你可能是对的(1;)不,这还不够,因为您使用的是相同的绝对增量,这最终不是正确的排序顺序。@nina scholz如果OP真的检查了他的测试用例,我就不太适合舒尔了。。。然而,你可能是对的(1;)