2016 년 업데이트 :
snazzier Ecmascript 6 버전은 다음과 같습니다.
zip= rows=>rows[0].map((_,c)=>rows.map(row=>row[c]))
그림 equiv. 에 파이썬 { zip(*args)
} :
> zip([['row0col0', 'row0col1', 'row0col2'],
['row1col0', 'row1col1', 'row1col2']]);
[["row0col0","row1col0"],
["row0col1","row1col1"],
["row0col2","row1col2"]]
(그리고 FizzyTea 다음 함수 정의 파이썬처럼 행동하지만, 고지 아래 참조 ...이 때문에 자신의 역 없습니다 있도록 ES6는 가변 인수 구문 지적 zip(zip(x))
것 같지 x
맷 크레이머 지적한대로했지만, zip(...zip(...x))==x
추천 ( 일반 파이썬에서 zip(*zip(*x))==x
))
대체 정의 equiv. 에 파이썬 { zip
} :
> zip = (...rows) => [...rows[0]].map((_,c) => rows.map(row => row[c]))
> zip( ['row0col0', 'row0col1', 'row0col2'] ,
['row1col0', 'row1col1', 'row1col2'] );
// note zip(row0,row1), not zip(matrix)
same answer as above
(현재 ...
구문에 성능 문제가있을 수 있으며 나중에는 가변적 인수와 함께 두 번째 답변을 사용하는 경우 구문 테스트를 수행 할 수 있습니다.)
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(...)
위의 배열은 배열의 크기가 동일해야한다고 가정합니다. 또한 인수 목록이 가변적 인 Python 버전과 달리 단일 목록 인수 목록을 전달한다고 가정합니다. 이러한 "기능"을 모두 원하면 아래를 참조하십시오. 약 2 줄의 추가 코드가 필요합니다.
다음은 zip
배열의 크기가 같지 않고 더 긴 배열 부분이 존재하지 않는 척하는 에지 사례에서 Python의 동작을 모방 합니다.
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()
// []
이것은 배열이 정의되지 않은 위치를 itertools.zip_longest
삽입 undefined
하여 Python의 동작 을 모방합니다 .
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()
// []
이 마지막 두 버전 (다양한 여러 인수 버전)을 사용하는 경우 zip은 더 이상 고유 한 역이 아닙니다. zip(*[...])
파이썬 의 관용구 를 모방하려면 zip.apply(this, [...])
zip 함수를 반전시키고 싶거나 가변 수의 목록을 입력으로하고 싶을 때해야합니다.
부록 :
이 핸들을 반복 가능하게 만들려면 (예 : Python zip
에서 문자열, 범위, 맵 객체 등에서 사용할 수 있음) 다음을 정의 할 수 있습니다.
function iterView(iterable) {
// returns an array equivalent to the iterable
}
당신이 쓰는 그러나 경우 zip
다음의 방법으로 , 심지어는 필요하지 않을 것입니다 :
function zip(arrays) {
return Array.apply(null,Array(arrays[0].length)).map(function(_,i){
return arrays.map(function(array){return array[i]})
});
}
데모:
> JSON.stringify( zip(['abcde',[1,2,3,4,5]]) )
[["a",1],["b",2],["c",3],["d",4],["e",5]]
(또는 range(...)
이미 파이썬 스타일 함수를 작성했다면 사용할 수 있습니다 . 결국 ECMAScript 배열 이해 또는 생성기를 사용할 수 있습니다.)