JavaScript에서 Python의 zip() 및 zip_longest() 에뮬레이션
15041 단어 javascript
zip()
함수가 작동하는 방식을 에뮬레이트하는 방법입니다.let a = [1, 3, 5];
let b = [2, 4, 6];
const mapping = a.map((item, idx) => [item, b[idx]]);
console.log(mapping);
// result
[ [ 1, 2 ], [ 3, 4 ], [ 5, 6 ] ]
이를 가능하게 하는 것은 JavaScript 배열 메소드(
map()
, forEach()
, 심지어 filter()
)가 배열을 반복하는 동안 최대 3개의 인수(요소, 인덱스, 배열)를 취하기 때문입니다.여기서
element
는 반복자가 각 단계에서 가리키는 요소이고 index
는 원래 배열에서 이 항목의 인덱스입니다. 그리고 세 번째 인수가 원래 배열이라는 점에 주목할 가치가 있습니다.JavaScript 배열의
map()
메서드가 zip()
보다 유연하기 때문에 반복 항목이나 배열에 더 많은 작업을 수행할 수 있습니다. 그러나 array
로 무엇이든 하고 싶다면 원래 배열이 그에 따라 변경됨을 기억하십시오. 이 경우 a
:let a = [1, 3, 5];
let b = [2, 4, 6];
const mapping = a.map((item, idx, array) => {
array.push(item*2);
return [item, b[idx]]} );
console.log(mapping);
// Result
[ [ 1, 2 ], [ 3, 4 ], [ 5, 6 ] ]
console.log(a);
// Result
[ 1, 3, 5, 2, 6, 10 ]
보시다시피, 정수 2, 6 및 10은 배열의 끝에 푸시됩니다.
파이썬은
zip_longest()
에서 itertools
함수를 제공합니다.zip()
는 가장 짧은 목록에 맞게 긴 목록을 잘라내지만 zip_longest()
는 가장 긴 목록에 맞게 더 짧은 목록을 늘립니다. 더 짧은 목록의 빈 슬롯은 주어진 값으로 채워집니다. 기본적으로 이 fillvalue
는 None
입니다.이 기능이 작동하는 방식은 다음과 같습니다.
import itertools
a = [1, 3, 5, 7, 9]
b = [-1, -3, -5]
c = itertools.zip_longest(a, b)
print(list(c))
# Result
[(1, -1), (3, -3), (5, -5), (7, None), (9, None)]
아래에서는 JavaScript에서 이 기능을 에뮬레이트하려고 합니다.
👀 먼저 라인부터 볼까요? 특히, 무한한 수의 인수를 사용하기 위해 ellipsis operator 을 사용하고 있습니다. star operator (*) in Python 을 사용하여 목록을 푸는 것과 달리
...args, fillvalue=null
와 같은 것을 사용하면 오류가 발생합니다. 따라서 fillvalue
인수를 허용하려면 한 쌍의 대괄호를 사용해야 합니다. (오리에게 주자.)let a = [5, 3, 1, -1, -3, -5]
let b = [6, 4, 2, 0, -2, -4, -6, -8]
let c = ['a', 'b', 'c', 'd']
const zipLongest = ([...args], fillvalue=null) => { 👀
const result = []
let i=0
while (args.some( argArray=> argArray[i])) {
const ithColumn = args.map(
argArray=> {
item = (typeof argArray[i] === 'undefined') 👓
? fillvalue
: argArray[i]
return item
}
)
result.push(ithColumn)
i++
}
return result
}
console.log(zipLongest([a, b, c], fillvalue="duck"))
// Result
[
[ 5, 6, 'a' ],
[ 3, 4, 'b' ],
[ 1, 2, 'c' ],
[ -1, 0, 'd' ], 🙄
[ -3, -2, 'duck' ],
[ -5, -4, 'duck' ],
[ 'duck', -6, 'duck' ],
[ 'duck', -8, 'duck' ]
]
그럼 👓라인으로 이동합니다. JavaScript 배열의 빈 슬롯은 고려됩니다
undefined
.그러나
undefined
및 기타 잘못된 값(예: 빈 문자열 및 0)은 모두 false
로 평가됩니다. 이것은 이 삼항 조건을 혼동할 것입니다. 결과적으로 우리는 라인 🙄에 [ -1, undefined, 'd' ]
를 얻게 될 것입니다.더 좋은 방법은 반복하면서 항목 유형을 확인하는 것입니다. 그러나 잘못된 방법은
typeof nonExistentValue === undefined
를 사용하는 것입니다.nonExistentValue
는 실제로 정의되지 않았지만 typeof
는 문자열인 "undefined"
를 반환합니다. 그리고 이 문자열은 문자열입니다. 그것은 존재하지 않는 것에 대한 예약어와 결코 같지 않습니다. 따라서 우리가 라인 👓에서 사용한 조건.
Reference
이 문제에 관하여(JavaScript에서 Python의 zip() 및 zip_longest() 에뮬레이션), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/t0nghe/emulating-python-s-zip-and-ziplongest-in-javascript-3den텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)