Javascript 生成返回组合数组的函数?

Javascript 生成返回组合数组的函数?,javascript,arrays,Javascript,Arrays,我试图定义一个函数merge,当给定两个包含数字的排序数组时,它将返回两个列表中的数字的排序数组 merge([ 4, 5, 6 ], [ 1, 2, 3, 4 ]) => [ 1, 2, 3, 4, 4, 5, 6 ] merge([ 4 ], [ 2, 5, 8 ]) => [ 2, 4, 5, 8 ] merge([ 1, 2, 6 ], []) => [ 1, 2, 6 ] 这是我的代码: function merge(arr1, arr2) { return a

我试图定义一个函数merge,当给定两个包含数字的排序数组时,它将返回两个列表中的数字的排序数组

merge([ 4, 5, 6 ], [ 1, 2, 3, 4 ]) => [ 1, 2, 3, 4, 4, 5, 6 ]
merge([ 4 ], [ 2, 5, 8 ]) => [ 2, 4, 5, 8 ]
merge([ 1, 2, 6 ], []) => [ 1, 2, 6 ]
这是我的代码:

function merge(arr1, arr2) {
  return arr1.concat(arr2).sort(arr1, arr2);
}
虽然输出是正确的,但从我的研究和它的自动测试中,我被告知这段代码的风格不好。它写道:

不处理相同长度的两个数组

不处理较短的第一个数组

不处理较短的第二个数组


我编写这段代码的更好方法是什么?我应该做得更好吗

您的代码看起来不错,但使用排序的方式不正确。 使用sort的一种方法是提供一个函数来比较数组中的两个值,并返回一个正数或负数来指示这些值的排序。有关排序的详细信息

考虑对合并方法进行以下更改:

function merge(arr1, arr2) {
  return arr1.concat(arr2).sort(function(valueA, valueB) { return valueA - valueB; );
}

您的代码看起来不错,但是使用sort的方式不正确。 使用sort的一种方法是提供一个函数来比较数组中的两个值,并返回一个正数或负数来指示这些值的排序。有关排序的详细信息

考虑对合并方法进行以下更改:

function merge(arr1, arr2) {
  return arr1.concat(arr2).sort(function(valueA, valueB) { return valueA - valueB; );
}

其他答案已经给出了如何使代码正确的字面答案。然而,它可能没有抓住要点。您描述的函数用于构建合并排序,这是一种非常重要的排序算法,其主要优点是只需按顺序读取输入列表一次,从而导致每次传递的复杂性;这使得它甚至可以对无法放入内存的内容进行排序。您的代码没有这样做-它依赖于排序,每次调用函数时都在logN上,并且它没有利用两个输入都已预排序这一事实,这是合并排序的关键要求


合并排序算法将从两个列表中获取第一个元素,然后追加较小的元素。然后,它将该列表中的下一个元素与另一个列表的第一个元素进行比较,并再次获取较小的元素。重复此操作,直到一个列表用尽,然后追加剩余的列表。您可以在上找到关于合并排序的更详尽的解释。

其他答案已经给出了如何使代码正确的字面答案。然而,它可能没有抓住要点。您描述的函数用于构建合并排序,这是一种非常重要的排序算法,其主要优点是只需按顺序读取输入列表一次,从而导致每次传递的复杂性;这使得它甚至可以对无法放入内存的内容进行排序。您的代码没有这样做-它依赖于排序,每次调用函数时都在logN上,并且它没有利用两个输入都已预排序这一事实,这是合并排序的关键要求

合并排序算法将从两个列表中获取第一个元素,然后追加较小的元素。然后,它将该列表中的下一个元素与另一个列表的第一个元素进行比较,并再次获取较小的元素。重复此操作,直到一个列表用尽,然后追加剩余的列表。您可以在上找到关于合并排序的更详尽的说明。

只需在应用简单的排序函数后对数组进行合并并返回即可: logmerge[4,5,6],[1,2,3,4]//[ 1, 2, 3, 4, 4, 5, 6 ] logmerge[4],[2,5,8]//[ 2, 4, 5, 8 ] console.logmerge[1,2,6]//[ 1, 2, 6] 函数a,b{ 返回a.concatb.sorta,b=>a-b; } 只需对数组进行concat,并在应用简单的排序函数后返回: logmerge[4,5,6],[1,2,3,4]//[ 1, 2, 3, 4, 4, 5, 6 ] logmerge[4],[2,5,8]//[ 2, 4, 5, 8 ] console.logmerge[1,2,6]//[ 1, 2, 6] 函数a,b{ 返回a.concatb.sorta,b=>a-b; } Amadan注意到了问题的限制,并指出这可以按时完成。本质上,当输入都被排序时,算法就是合并排序中的合并步骤。这是在线性时间内完成的,并且以一种非常简单和令人愉快的方式工作:查看每个列表的第一项,并从两个列表中选取较小的一项,直到其中一个或两个列表都用尽。然后,将所有剩余元素固定到结果数组上并返回它

其他答案都很好,JS风格很好,但是在log n time中,完全忽略了数组是预先排序的,没有提及,这几乎肯定不是要求这个例程的人想要的答案

以下是合并步骤:

常数合并=a,b=>{ 常量结果=[]; 而a.length和b.length{ 结果:pusha[0][ 1, 2, 3, 4, 4, 5, 6 ] console.logmerge[4],[2,5,8];//=>[ 2, 4, 5, 8 ] console.logmerge[1,2,6];/=>[1,2,6]Amadan注意到了 对问题进行了约束,并指出这是可以按时写的。本质上,当输入都被排序时,算法就是合并排序中的合并步骤。这是在线性时间内完成的,并且以一种非常简单和令人愉快的方式工作:查看每个列表的第一项,并从两个列表中选取较小的一项,直到其中一个或两个列表都用尽。然后,将所有剩余元素固定到结果数组上并返回它

其他答案都很好,JS风格很好,但是在log n time中,完全忽略了数组是预先排序的,没有提及,这几乎肯定不是要求这个例程的人想要的答案

以下是合并步骤:

常数合并=a,b=>{ 常量结果=[]; 而a.length和b.length{ 结果:pusha[0][ 1, 2, 3, 4, 4, 5, 6 ] console.logmerge[4],[2,5,8];//=>[ 2, 4, 5, 8 ]
console.logmerge[1,2,6];/=>[1,2,6]都是正确的,但除非您处理的是大型数据集,而且性能至关重要,否则使用内置函数可能就足够了。@Barmar:都是正确的,除非练习的目的是了解合并排序:我确实说可能没有抓住重点,因为我不知道目的;但是输入数组已经排序的断言是很有启发性的。@Amadan-知识是很有启发性的……因此,无论哪种方式,信息越多越好。这都是真的,但除非您处理的是大型数据集且性能至关重要,否则使用内置函数可能就足够了。@Barmar:All-true,除非练习的目的是学习合并排序:我确实说可能没有抓住重点,因为我不知道目的;但是输入数组已经排序的断言非常具有指示性。@Amadan-knowledge很有启发性……因此,无论哪种方式,信息越多越好。当我尝试您的代码时,控制台中会出现错误,因为排序的参数必须是函数,而不是数组。你确定你的输出正确吗?你是对的,它一定是一个函数。当我尝试你的代码时,我在控制台中得到一个错误,因为排序的参数必须是一个函数,而不是数组。你确定你的输出是正确的吗?是的,它一定是一个函数。