我问this question关于使用键函数对数组进行排序,结果证明无法避免使用比较函数。
问题是
这是一个示例数组和(便宜的)键函数:
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'}]
鉴于这些情况,我如何有效对数组进行排序?
答案 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'}]
请注意,这仅在键函数返回数字时有效。