根据内部数组中的值对外部数组进行排序,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:不过,在这种情况下,使用==
可能更有意义——因为>
和<
也会进行类型转换,所以如果你使用===
在上面的代码中,如果值是 ==
而不是 ===
,您将错误地返回 1
。【参考方案3】:
这里曾经是一个排序实现,它返回一个简单的x<y
比较的结果。不鼓励此解决方案,仅保留此帖子以保留随后的讨论。
【讨论】:
哦。我不知道您可以只返回 x[a] > y[a] 以获得这样的比较值。这将为我节省几行代码。 @David:您正在返回true
或false
。您需要返回 -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 节(关于 >
):“比较...产生真、假或未定义(这表明至少一个操作数是 NaN)。” 因此,从函数中返回 true
或 false
会导致未定义的行为,并且由于函数必须具有三种可能的结果,因此行为不正确。以上是关于根据内部数组中的值对外部数组进行排序,javascript的主要内容,如果未能解决你的问题,请参考以下文章