2012-06-11 3 views
9

개체 /지도/해시 값을 변환하는 유비쿼터스/표준 Javascript 또는 Coffeescript 함수가 있습니까?오브젝트 * 값을 변환하는 자바 스크립트 또는 Coffeescript`map` 함수는 무엇입니까?

그러나 Array만을 생성합니다.
Underscore has _.map 또한 Array만을 생성합니다.

분명히하기 위해,이 것과 같은 기능이 내가 원하는 것입니다. (이 예제는 자바 스크립트없는 커피 스크립트로 작성된 것입니다.) 당신이 개체에 개체를 매핑하려면

# Transforms the values in a map. (Doesn't modify `obj` — returns a new map.) 
# Example usage: 
# mapObjVals({ a: 'aa', b: 'bb'}, (key, value) -> value + '_!') 
# --> { a: 'aa_!', b: 'bb_!' } 
mapObjVals = (obj, f) -> 
    obj2 = {} 
    for k, v of obj 
    obj2[k] = f k, v 
    obj2 
+1

당신은 자신의 질문에 대답 해 보였습니다 :) 프로토 타입 확장에 의해 비트되는 것을 방지하기 위해'자신의 k, v의 obj'를 사용해야합니다. 나는 'for' 루프를 도우미 함수 대신 직접 사용합니다. 이것은 드물게 발생하기 때문입니다. –

답변

6

, 당신은 밑줄 사용하는 fold (전통 기능 용어) 또는 reduce (공통 현대적인 이름을 사용할 필요가)는 컬렉션에서 새로운 값을 만듭니다.

_.reduce(obj, function(newObj, thisValue, thisKey) { 
     // modify newObj based on thisKey/thisValue 
     return newObj; 
     }, {}) 

두 번째 인수로 전달 된 함수는 키/값 쌍마다 한 번 호출됩니다. 이것은, 최초의 인수로서 구축되는 객체에 건네 주어, 그 뒤에 현재의 값이 계속되어, 거기에 관련 지을 수 있었던 열쇠가 계속됩니다. 객체를 수정하고 새로운 값을 반환하는 것은 함수에 달려 있습니다.

_.reduce의 세 번째 인수는 첫 번째 키/값 쌍과 함께 전달 될 새 개체의 초기 값입니다. 이 경우 빈 오브젝트/맵/해시 {}입니다.

Reduce/fold/inject는 일반적으로 합계 값으로 사용됩니다. 기본적으로 컬렉션에서 새 단일 값을 생성하려는 경우 언제든지 map은 실제적으로 reduce의 특별한 경우입니다. 여기에서는 주장 된 가치가 감소 된 값은 실제로 원본과 동일한 크기의 다른 컬렉션입니다.

AFAIK의 CoffeeScript의 경우 목록 내포는 개체를 반복 할 때도 항상 목록을 반환합니다. 따라서 the CoffeeScript version of Underscore을 조사하고 싶을 수도 있습니다.

+0

고마워요! '_ '와 같이 작업하는 예제는'_ ('aa ', b :'bb '}). reduce ((memo, value, index) -> Memo), {}' – KajMagnus

+1

"유감스럽게도,'_.reduce'로, 나는 1) 이터레이터 내부에서'memo'를 리턴하고, 2)'{ }'을''reduce '. 그래서 다소 길어집니다. 실제로 나는 mapObjVals ({a : 'aa', b : 'bb'}, (key, value) -> value + '_!')를 읽을 때 나의 예제 함수를 더 쉽게 이해할 수있다. 끝내고있는 일. – KajMagnus

+0

예, reduce는 좀 더 장황합니다. 지도는 쉽게 감소의 측면에서 구현할 수 있습니다. 그 자세한 내용을 숨기려는 도우미 함수를 작성해야 할 필요성을 느낄 지 여부는 개인적인 취향에 달려 있습니다. –

관련 문제