Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/411.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 如果值存在,则对对象数组进行排序_Javascript - Fatal编程技术网

Javascript 如果值存在,则对对象数组进行排序

Javascript 如果值存在,则对对象数组进行排序,javascript,Javascript,下面是我的排序函数,但我想显示那些顶部带有代码的函数。我想先按代码,然后按描述对对象数组进行排序。现在,没有代码的项目被放在订单的顶部 data = [ { code: "1.1", description: "aaa" }, { code: "", description: "bbb" }, { code: "1.2", description: "ccc" } ] let sortedData = data.sort(function(a, b)

下面是我的排序函数,但我想显示那些顶部带有代码的函数。我想先按代码,然后按描述对对象数组进行排序。现在,没有代码的项目被放在订单的顶部

data = [
 {
  code: "1.1",
  description: "aaa"
 },
 {
  code: "",
  description: "bbb"
 },
 {
  code: "1.2",
  description: "ccc"
 }
]


  let sortedData = data.sort(function(a, b) {
    let codeA = a.code
    let codeB = b.code
    let descriptionA = a.description.toLowerCase()
    let descriptionB = b.description.toLowerCase()

    if (codeA < codeB) return -1
    if (codeA > codeB) return 1
    if (descriptionA < descriptionB) return -1
    if (descriptionA > descriptionB) return 1
    return 0
  })

  return sortedData
数据=[
{
代码:“1.1”,
描述:“aaa”
},
{
代码:“,
说明:“bbb”
},
{
代码:“1.2”,
说明:“ccc”
}
]
让sortedData=data.sort(函数(a,b){
设codeA=a.code
设codeB=b.code
让descriptionA=a.description.toLowerCase()
let descriptionB=b.description.toLowerCase()
如果(代码a<代码b)返回-1
如果(代码A>代码B)返回1
if(descriptionAdescriptionB)返回1
返回0
})
返回数据
当前订单:

[“bbb”、“aaa”、“ccc”]

预期订单:

[“aaa”、“ccc”、“bbb”]
  • 使用xor
    ^
    运算符,我们可以检查其中一个代码是否为假代码,而另一个代码是否为真代码。在这种情况下,falsy是空白的。如果这是真的,则带有空白的一个应该大于另一个,以便它在后面排序
  • 否则,减去代码,然后减去描述以进行正常排序
var数据=[
{
代码:“1.1”,
描述:“aaa”
},
{
代码:“,
说明:“bbb”
},
{
代码:“1.2”,
说明:“ccc”
}
];
让sortedData=data.sort(函数(a,b){
设codeA=a.code;
设codeB=b.code;
让descriptionA=a.description.toLowerCase();
让descriptionB=b.description.toLowerCase();
如果(代码A^代码B){
返回!代码A?1:-1;
}
返回codeA.localeCompare(codeB)| | descriptionA.localeCompare(descriptionB);
});
console.log(sortedData)
使
出现在末尾的一种方法是给比较值加前缀,因此如果代码为“”,则值变为
“B”
,如果是
1.1
则变为
A1.1
,因此
A1.1
B

这样做也很容易修改,以进行各种各样的奇特排序,例如,假设您想按字母顺序排序,但在开始时希望所有
K
,在结束时希望所有
B
,这是一件奇怪的事情。但这很容易实现。我想你可以称之为例外排序

下面是一个工作示例

const数据=[
{
代码:“1.1”,
描述:“aaa”
},
{
代码:“,
说明:“bbb”
},
{
代码:“1.2”,
说明:“ccc”
}
];
data.sort((
{code:code1,description:desc1},
{code:code2,description:desc2}
) => {
代码1=(代码1==“”?“B”:“A”)+代码1;
代码2=(代码2==“”?“B”:“A”)+代码2;
返回代码1.localeCompare(代码2)||
描述1.本地比较(描述2);
});

控制台日志(数据)由于您的第二个代码是空的,您将比较一个空字符串,Javascript将把您的
浮点值
转换为
字符串
。奇怪的是,如果比较任何字符串,如果它比任何其他字符串都小,它将始终返回
true
!反之亦然-如果将其与任何其他字符串进行比较,使其大于任何其他字符串,则它将始终返回
false

"" < "1.1" // return true
"1.1" < "" // return true!

"" > "1.1" // return false
"1.1" > "" // return false!
”<“1.1”//返回真值
“1.1”<”“//返回true!
“”>“1.1”//返回false
“1.1”>“”//返回false!
为了解决您的问题,您可以在其他检查之前添加两个附加检查

if (codeA === "" && codeA.length < codeB.length) return 1;
if (codeB === "" && codeA.length > codeB.length) return -1;
if(codeA==”&&codeA.lengthcodeB.length)返回-1;

如果codeA或codeB是
字符串
,您可以简单地比较字符串的长度。

您的测试用例有点松散,很难发现一些错误。通常最好使用
localeCompare
来比较字符串。您可以使用两个非常简单但可读的
if
语句,后跟字符串的
localeCompare

这里有几个额外的测试用例

let数据=[{
代码:“1.1”,
说明:“ddd”
},
{
代码:“1.101”,
说明:“ccc”
},
{
代码:“,
描述:“eee”
},
{
代码:“1.2”,
说明:“德”
},
{
代码:“1.1”,
描述:“aaa”
},
{
代码:“,
说明:“bbb”
},
{
代码:“1.2”,
说明:“ccc”
},
{
代码:“1.2”,
说明:“AbcD”
}
]
数据排序((a,b)=>{
if(a.code&!b.code)返回-1
如果(b.code&!a.code)返回1
返回a.code.localeCompare(b.code)| | a.description.localeCompare(b.description)
})

console.log(数据)
什么是“aaa”-“bbb”
相等?在代码相等的情况下,这不会正确排序描述字符串。它看起来很有效,因为它们已经排序。@MarkMeyer修复了它以正确使用localeCompare。