【问题标题】:Mix two arrays in the given order [duplicate]按给定顺序混合两个数组[重复]
【发布时间】:2016-06-11 02:29:41
【问题描述】:

有 javascript 任何内置方法 是否可以以 相同的顺序 合并/组合两个数组?这是一个基本简单的任务,可以通过迭代两者的最小长度并将每个值添加到新数组中来解决:

var a = [1, 2, 3]
var b = [4, 5, 6]
var c = []

for (var i = 0; i < 3; i++) {
  c.push(a[i])
  c.push(b[i])
}

// => [1, 4, 2, 5, 3, 6]

但是,我只是问我是否可以使用任何内置方法来完成。首先我想到了concatsort,但这感觉就像矫枉过正(与循环和性能相比)......

a.concat(b).sort(doItRight)

更具体地说,这些数组可能包含 stringsnumbers...

var a = [0, '1', 'c']
var b = ['d', 4, 'f']
var c = [0, 'd', '1', 4, 'c', 'f']

有什么想法或想法吗?

更新

只是忘了注意输入数组可能不止两个。我真的很喜欢 reduce works in this case 的方式,而且由于重复问题中的答案使用了丑陋的嵌套循环,我认为 reduce 会有所帮助吗?

更新 2

String.raw 可能会被滥用以将字符串压缩

String.raw({ raw: '123 ' }, 4, 5, 6)
// => '142536'

【问题讨论】:

  • 这个函数通常叫做zip,它不是JS内置的,但是很容易实现——见here。您需要使用[].concat.apply([], zip(arrays)) 将压缩结果展平
  • @georg 呃,不...我只需要一个数组作为结果...这不是zip ;)
  • 是的,刚刚意识到,重新打开并编辑了评论。 ^^^^
  • 是的,看到了......无论如何,这比 just concat/sort 更加矫枉过正:P
  • 你不能在这里使用 .sort() ,因为你想要的顺序与值本身无关,它与值的来源有关。只需将您显示的循环放入函数中并继续 - 在添加一些长度检查以防输入数组具有不同长度之后。

标签: javascript arrays sorting merge concatenation


【解决方案1】:

没有内置函数,但是有更多函数式的方法可以做到这一点。通常,如果我有一个“创建一个数组,然后循环某些内容并附加到数组”形式的工作解决方案,我会改为使用reduce。您可以使用reduce 定义zip 函数,如下所示:

const zip = (a,b) => a.reduce( (c,x,i) => c.concat(x, b[i]), [] );

这是一个演示:

const zip = (a, b) => a.reduce((c, x, i) => c.concat(x, b[i]), []);
const a = [1, 2, 3];
const b = [4, 5, 6];
console.log( zip([1, 2, 3], [4, 5, 6]) );
//=> [ 1, 4, 2, 5, 3, 6 ]
console.log( zip([0, '1', 'c'], ['d', 4, 'f']) );
//=> [ 0, 'd', '1', 4, 'c', 'f' ]

【讨论】:

  • ~5 年才能接受你的回答...真丢人!
  • 实际上只有 2 年!而且永远不会太晚。谢谢。
猜你喜欢
  • 2021-02-27
  • 1970-01-01
  • 2023-02-24
  • 1970-01-01
  • 1970-01-01
  • 2016-06-17
  • 1970-01-01
  • 2019-09-30
  • 1970-01-01
相关资源
最近更新 更多