Voici un oneliner:
function zip(arrays) {
return arrays[0].map(function(_,i){
return arrays.map(function(array){return array[i]})
});
}
// > zip([[1,2],[11,22],[111,222]])
// [[1,11,111],[2,22,222]]]
// If you believe the following is a valid return value:
// > zip([])
// []
// then you can special-case it, or just do
// return arrays.length==0 ? [] : arrays[0].map(...)
Le ci-dessus suppose que les matrices sont de taille égale, comme ils devraient l'être. Cela suppose également de vous transmettre en une seule liste de listes argument, contrairement à python version où la liste d'arguments est variadic. Si vous voulez que tous ces "fonctionnalités", voir ci-dessous. Il faut à peu près 2 lignes de code supplémentaires.
La suivante va imiter python zip
comportement sur le bord des cas où les tableaux ne sont pas de taille égale, silencieusement prétendant le plus de parties de tableaux n'existent pas:
function zip() {
var args = [].slice.call(arguments);
var shortest = args.length==0 ? [] : args.reduce(function(a,b){
return a.length<b.length ? a : b
});
return shortest.map(function(_,i){
return args.map(function(array){return array[i]})
});
}
// > zip([1,2],[11,22],[111,222,333])
// [[1,11,111],[2,22,222]]]
// > zip()
// []
Ce sera imiter python itertools.zip_longest
comportement, l'insertion d' undefined
où les tableaux ne sont pas définis:
function zip() {
var args = [].slice.call(arguments);
var longest = args.reduce(function(a,b){
return a.length>b.length ? a : b
}, []);
return longest.map(function(_,i){
return args.map(function(array){return array[i]})
});
}
// > zip([1,2],[11,22],[111,222,333])
// [[1,11,111],[2,22,222],[null,null,333]]
// > zip()
// []
Si vous utilisez ces deux dernières version (variadic aka. plusieurs arguments versions), puis zip n'est plus à son inverse. Pour imiter l' zip(*[...])
idiome de python, vous aurez besoin de faire zip.apply(this, [...])
lorsque vous voulez inverser le zip de la fonction ou si vous voulez de la même manière, un nombre variable de listes comme entrée.
addendum:
Pour faire cette poignée importe quel itérable (par exemple en python, vous pouvez utiliser zip
sur les cordes, les gammes, les objets de la carte, etc.), vous pouvez définir les éléments suivants:
function iterView(iterable) {
// returns an array equivalent to the iterable
}
Toutefois, si vous écrivez zip
de la suivante façon, même cela ne sera pas nécessaire:
function zip(arrays) {
return Array.apply(null,Array(arrays[0].length)).map(function(_,i){
return arrays.map(function(array){return array[i]})
});
}
Démo:
> JSON.stringify( zip(['abcde',[1,2,3,4,5]]) )
[["a",1],["b",2],["c",3],["d",4],["e",5]]
(Ou vous pouvez utiliser un range(...)
python-style de la fonction, si vous avez écrit un déjà. Finalement, vous serez en mesure d'utiliser ECMAScript tableau des inclusions ou des générateurs.)