Javascript 基于值(数字)的排序数组-反应本机

Javascript 基于值(数字)的排序数组-反应本机,javascript,react-native,Javascript,React Native,我正在尝试按数字降序对数组进行排序,数组中的所有值默认为0,但数组中的某些项将增加到1,2,3,4。我想看一个按字母顺序排列的4,3,2,1,0,0,0,0,0的列表。按字母顺序排列0系列已成功。只有当赋值为1时,我才能完成排序,但现在不行了 字段“最近的”是将放置0,1,2,3,4的对象中的值 这是我的类型: this.state.locations.sort(function(a, b) { if(a.nearest) return -

我正在尝试按数字降序对数组进行排序,数组中的所有值默认为0,但数组中的某些项将增加到1,2,3,4。我想看一个按字母顺序排列的4,3,2,1,0,0,0,0,0的列表。按字母顺序排列0系列已成功。只有当赋值为1时,我才能完成排序,但现在不行了

字段
“最近的”
是将放置0,1,2,3,4的对象中的值

这是我的类型:

            this.state.locations.sort(function(a, b) {
                if(a.nearest) return -1;
                if(b.nearest) return 1;
                if(a.name.toLowerCase() < b.name.toLowerCase()) return -1;
                if(a.name.toLowerCase() > b.name.toLowerCase()) return 1;
                return 0;
               }).map((marker, i) => (
this.state.locations.sort(函数a,b){
如果(a.最近)返回-1;
如果(b)返回1;
if(a.name.toLowerCase()b.name.toLowerCase())返回1;
返回0;
}).map((标记,i)=>(

有人对此有明确的看法/解释吗?

您也应该注意本地比较字符串。以下是最佳组合

let位置=[
{最近的:0,名称:“1”},
{最近的:0,名称:“5”},
{最近的:4,名称:“2”},
{最近的:4,名称:“3”},
{最近的:1,名称:“2”},
{最近的:1,名称:“1”}
];
位置=位置。排序(函数(a,b){
常数nearestA=a.最近的| | 0;
常数nearestB=b.最近的| | 0;
常量nameA=a.name | |“”;
const nameB=b.name | |“”;
如果((nearestA | | nearestB)&(nearestA!=nearestB))返回nearestB-nearestA;
返回nameA.toLowerCase().localeCompare(nameB.toLowerCase());
});

console.log(locations);
对于这个答案,我假设您希望首先按最近的排序,如果最近的排序相同,则按名称排序

问题在于排序函数的前两行:

if(a.nearest) return -1;
if(b.nearest) return 1;
您只检查
a.nearest
b.nearest
的真实值或虚假值。这意味着如果
a.nearest
b.nearest
存在(而不是
0
),则永远不会比较名称

以下面的场景为例,其中
a.nearest=1
b.nearest=2
。由于
a.nearest
不正确,因此返回
-1
,将
a
移动到
b
之前,而
b
具有更大的
nearest

相反,您希望将它们相互比较,并且仅当它们相同时(取自):

相反,请使用
setState()

只能在构造函数中指定
此.state

对阵列进行适当排序,这意味着接收器将被替换

sort()
方法对数组的元素进行排序并返回排序后的数组。默认排序顺序为升序,将元素转换为字符串,然后比较它们的UTF-16代码单位值序列


因此,您应该在排序之前先复制一份。这可以通过例如,或者其他一些方法来完成。

如果(a.nearest!=b.nearest),这不应该是
返回b.nearest-a.nearest
请提供a.补充Ja͢ck的注释,您从未实际比较
a.nearest
b.nearest
。您只检查它们是否包含真实值或虚假值。如果
a.nearest
是其他值,则
0
,将返回
-1
。如果
b.nearest
如果不是
0
,则将返回
1
if(nearestA | nearestB)
不正确,仅检查是否存在值。如果存在
nearestA
nearestB
则始终使用
nearestB-nearestA
对它们进行比较,当它们相同时,后面不进行名称比较。这应该是
If(nearestA!=nearestB)
.lol,这是数字比较。我已经定义了默认值0。它可以正常工作。您可以添加数据并运行。它可以正常工作。否则,请给我数据进行测试。您当前的测试数据失败。
{nearest:1,name:2}
位于
{nearest:1,name:1}之前输出中的
。这应该是另一种方式,因为名称应按字母顺序排序(当最近的相同时)。已修复!谢谢!!
this.state.locations.sort(function(a, b) {
  if (a.nearest != b.nearest) return b.nearest - a.nearest;
  if (a.name.toLowerCase() < b.name.toLowerCase()) return -1;
  if (a.name.toLowerCase() > b.name.toLowerCase()) return 1;
  return 0;
});
// Wrong
this.state.comment = 'Hello';
// Correct
this.setState({comment: 'Hello'});