JavaScript에서 Python의 zip() 및 zip_longest() 에뮬레이션

15041 단어 javascript
이것은 본질적으로 JavaScript를 사용하여 Pythonzip() 함수가 작동하는 방식을 에뮬레이트하는 방법입니다.

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()는 가장 긴 목록에 맞게 더 짧은 목록을 늘립니다. 더 짧은 목록의 빈 슬롯은 주어진 값으로 채워집니다. 기본적으로 이 fillvalueNone 입니다.

이 기능이 작동하는 방식은 다음과 같습니다.

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"를 반환합니다. 그리고 이 문자열은 문자열입니다. 그것은 존재하지 않는 것에 대한 예약어와 결코 같지 않습니다. 따라서 우리가 라인 👓에서 사용한 조건.

좋은 웹페이지 즐겨찾기