如何在 JavaScript 中压缩两个数组?

IT技术 javascript arrays
2021-02-05 00:27:07

我有 2 个数组:

var a = [1, 2, 3]
var b = [a, b, c]

我想得到的结果是:

[[1, a], [2, b], [3, c]]

看起来很简单,但我就是想不通。

我希望结果是一个数组,其中两个数组中的每个元素都压缩在一起。

2个回答

使用map方法:

var a = [1, 2, 3]
var b = ['a', 'b', 'c']

var c = a.map(function(e, i) {
  return [e, b[i]];
});

console.log(c)

演示

这里完全是 javascript noob,但我的印象是索引必须在元素之前?也就是说,.map(function(index,element))?
2021-03-30 00:27:07
请注意,如果数组的长度不同,那么这将用未定义的值填充右侧(如果a更长)或将省略一些条目(如果b更长)。
2021-04-04 00:27:07
使用箭头符号甚至更好一点: var c = a.map((e, i) => [e, b[i]]);
2021-04-05 00:27:07
@runawaykid 答案是正确的。您可以查看有关回调参数MDN 地图文档参数是(按顺序):currentvalue, index,array
2021-04-06 00:27:07
您将如何从中创建字典/对象?
2021-04-09 00:27:07

相同长度的Zip 数组

使用Array.prototype.map()

const zip = (a, b) => a.map((k, i) => [k, b[i]]);

console.log(zip([1,2,3], ["a","b","c"]));
// [[1, "a"], [2, "b"], [3, "c"]]

不同长度的 Zip 数组:

使用Array.from()

const zip = (a, b) => Array.from(Array(Math.max(b.length, a.length)), (_, i) => [a[i], b[i]]);

console.log( zip([1,2,3], ["a","b","c","d"]) );
// [[1, "a"], [2, "b"], [3, "c"], [undefined, "d"]]

使用Array.prototype.fill()Array.prototype.map()

const zip = (a, b) => Array(Math.max(b.length, a.length)).fill().map((_,i) => [a[i], b[i]]);

console.log(zip([1,2,3], ["a","b","c","d"]));
// [[1, "a"], [2, "b"], [3, "c"], [undefined, "d"]]

谢谢@goteguru,我为不同长度的数组添加了另外两个示例。
2021-03-16 00:27:07
这个const zip = (arr1, arr2) => arr1.map((k, i) => [k, arr2[i]]);简洁大方
2021-03-20 00:27:07
谢谢@RokoC.Buljan,不错。但是我认为它应该是 Math.min。zip 来自函数式语言(就像 filter、map、reduce 和friends),它的主要目的是将两个流输入一个二进制计算。如果其中之一丢失,结果无论如何都是不确定的,因此我们应该早点停止。此外,在 FP 中,流可能是无限的(!),这意味着上述算法永远不会停止。当然,使用 js 数组不是这种情况,但这仍然是经典的“zip”。(性能方面:想象一个数组有 10 万个项目,而另一个只有十二个)。
2021-03-21 00:27:07
谢谢你。Foruntanely map 在我的环境中工作不过我记录了这个方法以防万一。
2021-03-30 00:27:07
优雅,但有缺陷。经典 zip 必须是可交换的,这个实现不是。检查不同长度的数组。
2021-04-08 00:27:07