使用 JavaScript reduce 函数对数组进行排序

新手上路,请多包涵

我经常研究一些 JavaScript 面试问题,突然我看到一个关于 reduce 排序函数的用法的问题 Array ,我在 MDN 中阅读了它的用法它在一些 medium 文章中,但是排序 Array 是如此创新:

 const arr = [91,4,6,24,8,7,59,3,13,0,11,98,54,23,52,87,4];

我想了很多,但我不知道如何回答这个问题, reduce call back 函数必须如何? reduce 函数的 initialValue 是什么?什么是 accumulator call back reduce currentValue

最后,这种方式是否比其他排序算法有一些好处?或者对改进其他算法有用吗?

原文由 AmerllicA 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.9k
2 个回答

在这里使用 reduce 没有意义,但是您可以使用一个新数组作为累加器并对所有元素进行插入排序:

 array.reduce((sorted, el) => {
  let index = 0;
  while(index < sorted.length && el < sorted[index]) index++;
  sorted.splice(index, 0, el);
  return sorted;
}, []);

这是 没有 减少的版本:

 array.sort((a, b) => a - b);


现在编写 reducer 的一些一般技巧:

reduce回调函数必须如何?

您要么采用累加器的方法,然后 reducer 应根据当前元素对累加器应用修改并将其返回:

 (acc, el) => acc

或者,如果累加器和元素具有相同的类型并且在逻辑上相等,则无需区分它们:

  (a, b) => a + b

reduce 函数的初始值是多少?

你应该问自己 “当它应用于空数组时应该减少什么?”

现在最重要的是:什么时候使用 reduce? (海事组织)

如果您想将数组的值归结为 _一个单一的值或对象_。

原文由 Jonas Wilms 发布,翻译遵循 CC BY-SA 4.0 许可协议

Array.sort 在使用 Array.reduce 鼓励纯函数的地方改变数组。您可以在排序之前克隆数组。

我相信这个问题旨在通过强制约束让你以不同的方式思考。它测试您对 reduce 工作原理的了解,正如答案所示,剥猫皮的方法有很多种。它将显示您在解决此问题时的 js 个人风格。

我选择使用 Array.findIndexArray.splice

 const sortingReducer = (accumulator, value) => {
  const nextIndex = accumulator.findIndex(i => value < i );
  const index = nextIndex > -1 ? nextIndex : accumulator.length;
  accumulator.splice(index, 0, value);
  return accumulator;
}

const input = [5,4,9,1];
const output = input.reduce(sortingReducer, []);

使用示例输入进行测试会产生

arr.reduce(sortingReducer, [])
// (17) [0, 3, 4, 4, 6, 7, 8, 11, 13, 23, 24, 52, 54, 59, 87, 91, 98]

原文由 Lex 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题