Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 按字母顺序排序JSON(最后为空值)_Javascript_Json_Sorting - Fatal编程技术网

Javascript 按字母顺序排序JSON(最后为空值)

Javascript 按字母顺序排序JSON(最后为空值),javascript,json,sorting,Javascript,Json,Sorting,我有一个JSON,格式如下: account = [ {"name":"Los Angeles", "country":"USA"}, {"name":"Boston", "country":"USA"}, {"name":"", "country":"USA"}, {"name":"Chicago", "country":"USA"} ] 最后,我尝试用空名称值按字母顺序A-Z对其进行排序 我已经尝试过了,但是,首先,这用空值对A-Z进行排序 acco

我有一个JSON,格式如下:

account = [
     {"name":"Los Angeles", "country":"USA"},
     {"name":"Boston", "country":"USA"},
     {"name":"", "country":"USA"},
     {"name":"Chicago", "country":"USA"}
]
最后,我尝试用空名称值按字母顺序A-Z对其进行排序

我已经尝试过了,但是,首先,这用空值对A-Z进行排序

account.sort( function( a, b ) {
    return a.name < b.name ? -1 : a.name > b.name ? 1 : 0;
});
account.sort(函数a、b){
返回a.nameb.name?1:0;
});
帐户.排序(功能(a,b){
如果(a.name==“”){
返回1;
}else if(b.name==“”){
返回-1;
}否则{
返回a.nameb.name?1:0;
}
});
对于字符串,空字符串被认为是最小的值,因此被排序为数组中的第一个元素

但是,我们需要根据需要更改默认行为,因此我们必须为其添加额外的逻辑

现在在排序中,当我们返回-1时,这意味着顺序很好并且符合要求。当返回1时,表示顺序相反,需要交换;当返回0时,两个对象/值相同,不需要执行任何操作

现在,在我们的例子中,我们需要将空字符串移到最后一个。因此,如果第一个对象/值是空字符串,则交换它并在数组中向右移动它。当第二个对象/值为空字符串时,不需要执行任何操作,因为最后需要执行该操作


因此,这就是工作原理。

您需要额外的子句来测试空字符串

帐户=[{
“名称”:“洛杉矶”,
“国家”:“美国”
}, {
“姓名”:“波士顿”,
“国家”:“美国”
}, {
“名称”:“,
“国家”:“美国”
}, {
“姓名”:“芝加哥”,
“国家”:“美国”
}]
account.sort(函数(a,b){
如果(b.name.length==0){
返回-1;
}
如果(a.name.length==0){
返回1;
}
返回a.city.localeCompare(b.city);
});
console.log(帐户)
不需要额外的ifs

帐户=[
{“姓名”:“洛杉矶”,“国家”:“美国”},
{“姓名”:“波士顿”,“国家”:“美国”},
{“姓名”:“、”国家”:“美国”},
{“姓名”:“芝加哥”,“国家”:“美国”}
]
account.sort(函数(a,b){
return(a.name | | | |“zzz”).localeCompare(b.name | | |“zzz”);
});

document.write(“+JSON.stringify(account,null,3))
想解释一下您的解决方案吗?那会更有价值。我记得你说过的话,菲利克斯,我会这么做的。谢谢你回复@nikhil,但是,它仍然是相同的排序结果。你必须说明
a
b
都是空的。请看@ShashiSingh-请立即查看。我的代码中有一个小错误。我过一会儿再补充细节。感谢您在此处提供相同的代码片段:解释?:)@FelixKling补充道,我倾向于以比特的形式发布答案以击败其他人:)仅供参考,您可以使用
localeCompare
返回a.city.localeCompare(b.city)只要你没有一个城市名为
“zzzz”
;)一个名为豊橋市 (丰桥)?这将在最后排序。只是说。。。这种“比任何名字都大的东西”的风格是脆弱的,我的解决方案不依赖额外的知识,读起来更像需求,更容易理解。@JuanMendes:基本上,这里的想法与排序算法中的
max=-Infinity
相同。非常普通和惯用。如果您处理unicodes,请随意使用
\uFFFF
而不是
zzz
。我确实理解这个想法,我只是指出,对于一般情况(如果您在比较对象并希望将null放在末尾),此技术不起作用,但“额外的if”会起作用。这是最简单的响应-我使用null作为默认值,绞尽脑汁寻找解决方案——唯一的改进是使用“\uFFFF”进行升序排序,使用“\u0000”进行降序排序。
account.sort( function( a, b ) {
    if(a.name === "") {
       return 1;
    } else if(b.name === "") {
       return -1;
    } else {
         return a.name < b.name ? -1 : a.name > b.name ? 1 : 0;
    }
});