如何基于计算量大的键函数有效地对数组排序?

时间:2018-10-06 22:26:28

标签: javascript sorting

我问this question关于使用键函数对数组进行排序,结果证明无法避免使用比较函数。

问题是

  1. 我有一个计算量大的 key 函数,我不得不以某种方式将其转换为 comparison 函数
  2. 我正在对对象数组进行排序,这意味着我无法使用哈希表来记住键函数的结果

这是一个示例数组和(便宜的)键函数:

myArr = [{'foo': 5, 'bar': 'hello'}, {'foo': 3, 'bar': 'world'}];
keyFunc = obj => obj.foo;  // sort by the value of the `foo` attribute

myArr.sort(???);
// result should be [{'foo': 3, 'bar': 'world'}, {'foo': 5, 'bar': 'hello'}]

鉴于这些情况,我如何有效对数组进行排序?

1 个答案:

答案 0 :(得分:0)

由于我们只希望对每个数组元素仅运行一次昂贵的键函数,因此我们别无选择,只能使用某种形式的记忆。将键值与每个元素相关联的最简单方法可能是创建[key, element]对数组,然后我们可以对其进行排序:

myArr = [{'foo': 5, 'bar': 'hello'}, {'foo': 3, 'bar': 'world'}];
keyFunc = obj => obj.foo;

// compute the key of each array element
keyedArr = myArr.map(obj => [keyFunc(obj), obj]);

// sort the array based on the key
keyedArr.sort((a, b) => a[0] - b[0])

// remove the key values from the array
result = keyedArr.map(pair => pair[1]);
// result: [{'foo': 3, 'bar': 'world'}, {'foo': 5, 'bar': 'hello'}]

请注意,这仅在键函数返回数字时有效。