根据内部数组中的值对外部数组进行排序,javascript

Posted

技术标签:

【中文标题】根据内部数组中的值对外部数组进行排序,javascript【英文标题】:sort outer array based on values in inner array, javascript 【发布时间】:2011-02-17 03:23:48 【问题描述】:

我有一个包含数组的数组,我想根据内部特定列中的值对外部数组进行排序。

我敢打赌,这听起来有点令人困惑,所以我会直接跳到一个例子。

初始数据:

var data = [
  [
    "row_1-col1",
    "2-row_1-col2",
    "c-row_1-coln"
  ],
  [
    "row_2-col1",
    "1-row_2-col2",
    "b-row_2-coln"
  ],
  [
    "row_m-col1",
    "3-row_m-col2",
    "a-row_m-coln"
  ]
];

根据索引为 1 的列对数据进行排序

data.sortFuncOfSomeKind(1);

对象在哪里看起来像这样;

var data = [
  [
    "row_2-col1",
    "1-row_2-col2",
    "b-row_2-coln"
  ],
  [
    "row_1-col1",
    "2-row_1-col2",
    "c-row_1-coln"
  ],
  [
    "row_m-col1",
    "3-row_m-col2",
    "a-row_m-coln"
  ]
];

根据索引为 2 的列对数据进行排序

data.sortFuncOfSomeKind(2);

对象在哪里看起来像这样;

var data = [
  [
    "row_m-col1",
    "3-row_m-col2",
    "a-row_m-coln"
  ],
  [
    "row_2-col1",
    "1-row_2-col2",
    "b-row_2-coln"
  ],
  [
    "row_1-col1",
    "2-row_1-col2",
    "c-row_1-coln"
  ]
];

大问题

您是否知道现有的解决方案,或者我必须自己写一个?如果是这样,哪个是最容易使用的排序算法?快速排序?

_L

【问题讨论】:

Sorting objects in an array by a field value in javascript、Javascript: How to sort an array of records by values in one of the fields? 的可能副本 【参考方案1】:

Array#sort(参见the spec 或MDC 的第15.4.4.11 节)接受一个可选的函数参数,该参数将用于比较两个条目以进行排序。如果第一个参数“小于”第二个参数,则该函数应返回 -1,如果它们相等,则返回 0,如果第一个参数“大于”第二个参数,则返回 1。所以:

outerArray.sort(function(a, b) 
    var valueA, valueB;

    valueA = a[1]; // Where 1 is your index, from your example
    valueB = b[1];
    if (valueA < valueB) 
        return -1;
    
    else if (valueA > valueB) 
        return 1;
    
    return 0;
);

(您显然可以稍微压缩该代码;为了清楚起见,我将其保持详细。)

【讨论】:

【参考方案2】:

这是一个不需要单独的变量来包含索引的解决方案

var arr = [.....]
arr.sort((function(index)
    return function(a, b)
        return (a[index] === b[index] ? 0 : (a[index] < b[index] ? -1 : 1));
    ;
)(2)); // 2 is the index

按索引 2 排序

【讨论】:

您应该将 = 更改为 ===。比较不喜欢被误认为是作业。 嗯,根据需要改成===== 是的,有一个小错误 - 现已修复 由于 Douglas Crockford 的一些建议,我倾向于建议 ===:“使用 ===!== 运算符几乎总是更好。== 和 @987654331 @ 运算符会强制进行类型转换。特别是,不要使用 == 与虚假值进行比较。”但我同意在某些情况下可能需要类型强制。 (见:javascript.crockford.com/code.html @awgy:不过,在这种情况下,使用== 可能更有意义——因为&gt;&lt; 也会进行类型转换,所以如果你使用===在上面的代码中,如果值是 == 而不是 ===,您将错误地返回 1【参考方案3】:

这里曾经是一个排序实现,它返回一个简单的x&lt;y 比较的结果。不鼓励此解决方案,仅保留此帖子以保留随后的讨论。

【讨论】:

哦。我不知道您可以只返回 x[a] > y[a] 以获得这样的比较值。这将为我节省几行代码。 @David:您正在返回truefalse。您需要返回 -1、0 或 1。(我确实检查过,以防我遗漏了一些非常酷的东西,但以上在所有情况下都无法正确排序。) @T.J.Crowder:当我运行该代码时,它正确输出'一-三-二'、'二-三-一'、'一-三-二'。只是您期望的按字母排序的输出。这不是你看到的结果吗? jsbin.com/ovoze3 @T.J.克劳德:此外:我的 - jsbin.com/ovoze3/edit 你的 - jsbin.com/ovoze3/2/edit 。在它们中点击“预览”>“开始”,它们将产生完全相同的结果 @David:见第 5 版第 15.4.4.11 节。规范 (ecma-international.org/publications/standards/Ecma-262.htm): 比较函数 "...应该是一个函数,它接受两个参数 x 和 y,如果 x y.” 和第 11.8.5 节(关于 &gt;):“比较...产生真、假或未定义(这表明至少一个操作数是 NaN)。” 因此,从函数中返回 truefalse 会导致未定义的行为,并且由于函数必须具有三种可能的结果,因此行为不正确。

以上是关于根据内部数组中的值对外部数组进行排序,javascript的主要内容,如果未能解决你的问题,请参考以下文章

按特定键的内部数组的值对PHP二维数组进行排序[重复]

php之快速入门学习-11(数组排序)

PHP:根据二维数组中的某个字段进行排序

如何根据每行的值范围对对象数组进行排序?

使用内部对象的实例变量的值对自定义对象数组进行排序

如何根据它们指向的值对双指针数组进行排序?