Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/437.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_Arrays - Fatal编程技术网

Javascript 按字母顺序排序数组,但有例外

Javascript 按字母顺序排序数组,但有例外,javascript,arrays,Javascript,Arrays,我有以下数组结构 [{ name: "Mobile Uploads" }, { name: "Profile Pictures" }, { name: "Reports" }, { name: "Instagram Photos" }, { name: "Facebook" }, { name: "My Account" }, { name: "Twitter" }] 我想对阵列重新排序,使其按以下顺序排列:配置文件图片,移动上传,Instagram照片,之后的对象

我有以下数组结构

[{
  name: "Mobile Uploads"
}, {
  name: "Profile Pictures"
}, {
  name: "Reports"
}, {
  name: "Instagram Photos"
}, {
  name: "Facebook"
}, {
  name: "My Account"
}, {
  name: "Twitter"
}]
我想对阵列重新排序,使其按以下顺序排列:
配置文件图片
移动上传
Instagram照片
,之后的对象按基本顺序排列

    var algo = [{
        name: "Mobile Uploads"
     },
     { 
        name: "Zeta"
     },
     {
        name: "Beta"
     },
     {
        name: "Alfa"
     },
     { 
        name: "Profile Pictures"
     },
     {
        name: "Instagram Photos"
     }]

var compare = function(a,b){
    var weight = {"Profile Pictures":1, "Mobile Uploads":2, "Instagram Photos":3}
    ,   nameA = a.name
    ,   weightA = weight[nameA] || 100
    ,   nameB = b.name
    ,   weightB = weight[nameB] || 100

    if(weightA != weightB){
        return weightA - weightB;
    }else{
        return nameA > nameB;
    }

}

console.log(algo.sort(compare));

其思想是分配权重来管理排序。

我认为最好的方法就是使用自定义的
排序来完成所有操作。sort回调函数有两个参数,第一个数组元素和它要比较的第二个数组元素。然后,您可以在回调主体中使用任何逻辑来决定返回什么。如果返回-1,则表示第一个元素应在第二个元素之前。如果返回1,则表示第二个元素应在第一个元素之前。如果返回0,这意味着这两个元素相等,因此应该彼此并排,以便在排序过程中不会将其他元素插入中间

要按字母顺序排序,可以使用
=
运算符将两个字符串相互比较。然后结果将是布尔值true或false,因此您需要返回
-1
1
,具体取决于您想要的是升序还是降序,以及您比较它们的方式。如果您认为在数组中会遇到重复项,并且希望实现的速度稍快一些(除非您处理的是大数据),那么还可以检查是否相等并返回
0

要将异常添加到字母排序中,我建议为第一个元素创建一个数字表示,然后为第二个元素创建另一个数字表示。使用负数表示异常之间的排序,其中,数字越小,表示该数组越接近数组的开头。然后对其他所有内容使用0表示它不是异常。最后,使用一个简单的if语句检查是否存在异常。如果没有例外,请按字母顺序排序。否则,我们有一个例外,应该按照较小的数字表示的顺序进行排序


变量输入阵列=[{
名称:“移动上传”
}, {
名称:“个人资料图片”
}, {
名称:“报告”
}, {
名称:“Instagram照片”
}, {
姓名:“Facebook”
}, {
姓名:“我的帐户”
}, {
名称:“推特”
}];
var-sortedArray=inputArray.slice(0)//原始数组的副本,因为排序是破坏性的。
sortedArray.sort(功能(a、b){
var-aIndex=0,bIndex=0;
开关(a.name)
{
案例“个人资料图片”:
aIndex=-3;
打破
案例“移动上传”:
aIndex=-2;
打破
案例“Instagram照片”:
aIndex=-1;
打破
}
开关(b.name)
{
案例“个人资料图片”:
bIndex=-3;
打破
案例“移动上传”:
bIndex=-2;
打破
案例“Instagram照片”:
bIndex=-1;
打破
}
if(aIndex<0 | | bIndex<0)//检查被比较的元素是否需要特殊处理
{
//在两个异常的情况下,我们希望首先对最小的一个进行排序
//否则,在一个异常的情况下,另一个元素将是0
返回aIndex})。加入(“,”)//个人资料图片、手机上传、Instagram照片、Facebook、我的帐户、报告、Twitter
您要做的是创建一个包含排序异常的对象。然后,您可以编写一个自定义函数来解释异常

var列表=[{
姓名:“日期”
}, {
名称:“移动上传”
}, {
名称:“个人资料图片”
}, {
名称:“Fig”
}, {
名称:“Instagram照片”
}, {
名字:“樱桃”
}, {
名称:“苹果”
}, {
名称:“香蕉”
}];
变量异常={
"个人资料图片":1,,
“移动上传”:2,
“Instagram照片”:3
}
列表.排序(函数(a,b){
if(异常[a.name]&异常[b.name]){
//如果两项都是例外
返回异常[a.name]-异常[b.name];
}else if(例外情况[a.name]){
//只有'a'在例外情况下,请将其排序到前面
返回-1;
}else if(例外情况[b.name]){
//例外情况中只有'b',请将其排序到后面
返回1;
}否则{
//无例外情况,返回字母排序
返回a.name.localeCompare(b.name);
}
});

控制台日志(列表)与其考虑移动元素,不如考虑创建一个新的数组,让元素按您想要的顺序排列。您可以使用诸如
sort
、或
map
、或
filter
之类的例程来完成此操作。在JS中,我们通常就是这样做的。顺便说一下,你在这里用了“高效”这个词。我在JS问题中看到了很多。从技术上讲,这意味着“快速性能”。这就是你的意思,或者你真的是说,就像通常的情况一样,“以一种易于阅读和书写的方式”?嘿@布朗,那么你正在寻找两个订单:个人资料图片、手机上传、Instagram照片和Instagram照片、手机上传、个人资料Pictures@torazaburo
sort
实际上会在数组中移动元素
map
filter
将创建新的数组,但是
sort
会就地运行;还不够吗?请阅读链接问题的答案。它不起作用了