对包含字符串的数组进行排序

4

我正在尝试对一个包含字符串数组的数组进行排序。这类似于这个问题 (Sort an array with arrays in it by string),但我不确定如何实现它。我的数组如下所示:

var myArray = [
            ['blala', 'alfred', '...'],
            ['jfkdj', 'berta', '...'],
            ['vkvkv', 'zimmermann', '...'],
            ['cdefe', 'albert', '...'],
          ];

我正在尝试按名称或内部数组的第二个参数进行字母排序(不区分大小写)。之后,如果有两个元素具有相同的第二个参数,则要按第一个参数进行排序。我尝试使用以下方法,但未成功,并且不太理解原因。能否有人提供建议:

function Comparator(a,b){
if (a[1] < b[1]) return -1;
if (a[1] > b[1]) return 1;
return 0;
}

var myArray = [
            ['blala', 'alfred', '...'],
            ['jfkdj', 'berta', '...'],
            ['vkvkv', 'zimmermann', '...'],
            ['cdefe', 'albert', '...'],
              ];

myArray = myArray.sort(Comparator);

我应该怎样才能以第二个参数为基准对第一个参数进行排序?
   function Comparator(a,b){
    if (a[1] < b[1]){ 
 if (a[2] < b[2]) return -1
 if (a[2] > b[2]) return 1;
}
return -1;
}
    if (a[1] > b[1]) return 1;{
    if (a[2] < b[2]) return -1
      if (a[2] > b[2]) return 1;
  }
return 1;
  }
return 0;
    }

    var myArray = [
                ['blala', 'alfred', '...'],
                ['jfkdj', 'berta', '...'],
                ['vkvkv', 'zimmermann', '...'],
                ['cdefe', 'albert', '...'],
                  ];

    myArray = myArray.sort(Comparator);

你多了一个 ) -- 试试这个 if(a[1] < b[1]) return -1; - Austin Greco
如果 (a[1] < b[1]) 则返回 -1; !== 如果(a[1]) < b[1]) 则返回 -1; - Ram
@Vohuman 相当确定他想要有人解释代码,而不是告诉他错别字的原因。 - Blob
请检查@gordon提供的解决方案:https://dev59.com/jm035IYBdhLWcg3wZ_Qt#17998413。其中包含他的解决方案的JSFiddle示例:http://jsfiddle.net/f14bpuyk/。 - vasilenicusor
你的第二个例子似乎是从1开始索引而不是0。 - kevin.groat
1个回答

3

你可以编写代码:

function Comparator(a, b) {
    // you can use the `String.prototype.toLowerCase()` method
    // if the comparison should be case insensitive
    if (a[1] < b[1]) return -1;
    if (a[1] > b[1]) return 1;
    if (a[0] < b[0]) return -1;
    if (a[0] > b[0]) return 1;
    return 0;
}

上述函数首先根据数组第二个元素进行排序。如果第二个元素相等,则根据第一个元素进行排序,如果 a[1] === b[1]a[0] === b[0],则返回 0,保持 ab 的位置不变。 来自 MDN 的 Array.prototype.sort 文档
如果提供了compareFunction,则按照比较函数的返回值对数组元素进行排序。如果正在比较的两个元素是ab,则:
  • 如果compareFunction(a, b)小于0,则将a排序到低于b的索引处,即a先出现。
  • 如果compareFunction(a, b)返回0,则相对于彼此保持不变,但相对于所有不同的元素进行排序。注意:ECMAscript标准不保证这种行为,因此并非所有浏览器(例如至少可以追溯到2003年的Mozilla版本)都会遵守此规定。
  • 如果compareFunction(a, b)大于0,则将b排序到低于a的索引处。 compareFunction(a, b)必须始终在给定特定一对元素ab作为其两个参数时返回相同的值。如果返回不一致的结果,则排序顺序是未定义的。

现在 - 我正在插入它,它可以工作,但我仍然不太明白它是如何工作的。 - djfkdjfkd39939
1
嗨,你可以在这里找到关于排序函数如何工作的更多解释:http://www.w3schools.com/jsref/jsref_sort.asp。 - vasilenicusor
它的运作方式是先比较名称——即a[1]和b[2]——如果其中一个在字母顺序上大于另一个,则返回1或-1,具体取决于哪个更大。如果两者都不是更大的,则意味着它们相等,因此它会继续并以相同的方式尝试比较a[0]和b[0]。 - kevin.groat
你是指第一行的a[1]和b[1]吗? - djfkdjfkd39939

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接