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

Posted

技术标签:

【中文标题】对其中包含字符串的数组进行排序【英文标题】:Sorting Array of Arrays with Strings in it 【发布时间】:2015-07-07 22:17:39 【问题描述】:

我正在尝试对包含字符串数组的数组进行排序。它类似于这个问题(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] &lt; b[1]) return -1; if (a[1] &lt; b[1]) return -1; !== if(a[1]) &lt; b[1]) return -1;! @Vohuman 相当肯定他希望有人解释代码,而不是为什么他的拼写错误。 检查@gordon ***.com/a/17998413/1841852提供的解决方案@一个JSFiddle示例和他的解决方案jsfiddle.net/f14bpuyk 您的第二个示例似乎是从 1 而不是 0 开始索引。 【参考方案1】:

你可以编码:

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 位置不变。

From MDN Array.prototype.sort documentation:

如果提供compareFunction,则数组元素根据比较函数的返回值进行排序。如果ab 是被比较的两个元素,那么:

如果compareFunction(a, b) 小于0,则将a 排序到比b 更低的索引,即a 排在第一位。 如果compareFunction(a, b) 返回0,则保持ab 彼此保持不变,但对所有不同元素进行排序。注意:ECMAscript 标准不保证这种行为,因此并非所有浏览器(例如至少可以追溯到 2003 年的 Mozilla 版本)都尊重这一点。 如果compareFunction(a, b) 大于0,则将b 排序到比a 更低的索引。 当给定一对特定元素 ab 作为其两个参数时,compareFunction(a, b) 必须始终返回相同的值。如果返回不一致的结果,则排序顺序未定义。

【讨论】:

现在 - 我正在插入它并且它可以工作,但我仍然不知道它是如何工作的 您好,您可以在此处找到有关排序功能如何工作的更多说明w3schools.com/jsref/jsref_sort.asp。 它的工作原理是首先比较名称 - 即 a[1] 和 b[2] - 如果一个大于另一个,则按字母顺序返回 1 或 -1 取决于哪个更伟大。如果两者都不更大,则意味着它们相等,因此它会继续并尝试以相同的方式比较 a[0] 和 b[0]。 你的意思是第一行的a[1]和b[1]?

以上是关于对其中包含字符串的数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在iOS中对包含数字和名称的字符串数组进行排序

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

使用计数值对数组进行排序

使用线性时间算法对仅包含 3 个字母的数组中的 2 个字母字符串进行排序

字符串排序空值