그만큼 map
underscore.js 함수는 javascript 객체와 함께 호출 된 경우 객체 값에서 매핑 된 값의 배열을 반환합니다.
_.map({one: 1, two: 2, three: 3}, function(num, key){ return num * 3; });
=> [3, 6, 9]
키를 보존하는 방법이 있습니까? 즉, 나는 반환하는 함수를 원한다
{one: 3, two: 6, three: 9}
그만큼 map
underscore.js 함수는 javascript 객체와 함께 호출 된 경우 객체 값에서 매핑 된 값의 배열을 반환합니다.
_.map({one: 1, two: 2, three: 3}, function(num, key){ return num * 3; });
=> [3, 6, 9]
키를 보존하는 방법이 있습니까? 즉, 나는 반환하는 함수를 원한다
{one: 3, two: 6, three: 9}
답변:
와 밑줄
밑줄은 _.mapObject
값을 매핑하고 키를 유지 하는 기능 을 제공 합니다.
_.mapObject({ one: 1, two: 2, three: 3 }, function (v) { return v * 3; });
// => { one: 3, two: 6, three: 9 }
와 Lodash
Lodash는 _.mapValues
값을 매핑하고 키를 유지 하는 기능 을 제공 합니다.
_.mapValues({ one: 1, two: 2, three: 3 }, function (v) { return v * 3; });
// => { one: 3, two: 6, three: 9 }
_.map()
반환 하고 다시 개체로 변환합니다. [['one', 3], ['two', 6], ['three', 9]]
_.object()
밑줄과 비슷한 유틸리티 라이브러리 인 lodash에서 필요한 기능을 찾을 수있었습니다.
http://lodash.com/docs#mapValues
_.mapValues(object, [callback=identity], [thisArg])
콜백을 통해 객체의 열거 가능한 각 속성을 실행하여 생성 된 객체 및 값과 동일한 키로 객체를 만듭니다. 콜백은 thisArg에 바인딩되며 세 개의 인수로 호출됩니다. (값, 키, 객체).
나는 이것이 오래되었다는 것을 알고 있지만 이제 Underscore에는 객체에 대한 새로운 맵이 있습니다.
_.mapObject(object, iteratee, [context])
물론 배열과 객체 모두에 대해 유연한지도를 만들 수 있습니다
_.fmap = function(arrayOrObject, fn, context){
if(this.isArray(arrayOrObject))
return _.map(arrayOrObject, fn, context);
else
return _.mapObject(arrayOrObject, fn, context);
}
mapObject
. mapValues
대신 lodash의 방법을보십시오.
일반 JS ( ES6 / ES2015 ) 에서이 버전은 어떻습니까?
let newObj = Object.assign(...Object.keys(obj).map(k => ({[k]: obj[k] * 3})));
객체를 재귀 적으로 매핑하려면 (중첩 된 obj 매핑) 다음과 같이 수행 할 수 있습니다.
const mapObjRecursive = (obj) => {
Object.keys(obj).forEach(key => {
if (typeof obj[key] === 'object') obj[key] = mapObjRecursive(obj[key]);
else obj[key] = obj[key] * 3;
});
return obj;
};
이후 ES7 / ES2016 당신이 사용할 수있는 Object.entries
대신에 Object.keys
이 같은 :
let newObj = Object.assign(...Object.entries(obj).map([k, v] => ({[k]: v * 3})));
나는 그것이 오랜 시간이라는 것을 알고 있지만 폴드 (일명 js로 줄임)를 통한 가장 확실한 해결책이 누락되었습니다. 완전성을 위해 여기에 남겨 두겠습니다.
function mapO(f, o) {
return Object.keys(o).reduce((acc, key) => {
acc[key] = f(o[key])
return acc
}, {})
}
_.map 은 객체가 아닌 배열을 반환합니다.
객체를 원한다면 each
; 과 같은 다른 기능을 사용하는 것이 좋습니다 . 정말로 맵을 사용하려면 다음과 같이 할 수 있습니다.
Object.keys(object).map(function(value, index) {
object[value] *= 3;
})
그러나 map
결과적으로 배열을 가지고 무언가를 만들 것으로 기대할 때 혼란 스럽 습니다.
map
배열을 생성하는 입력을 출력으로 변경하는 데 사용되는 이유 중 하나는 아마도 작성 _.object
하고 _.map
@GG로 할 수 있기 때문입니다. 글을 썼지 만,이 시점에서 그것은 맛의 문제입니다.
밑줄 맵 버그 의 혼합 수정 : P
_.mixin({
mapobj : function( obj, iteratee, context ) {
if (obj == null) return [];
iteratee = _.iteratee(iteratee, context);
var keys = obj.length !== +obj.length && _.keys(obj),
length = (keys || obj).length,
results = {},
currentKey;
for (var index = 0; index < length; index++) {
currentKey = keys ? keys[index] : index;
results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
}
if ( _.isObject( obj ) ) {
return _.object( results ) ;
}
return results;
}
});
올바른 키를 유지하고 객체로 반환하는 간단한 해결 방법이 게스트를 사용하여 bugy _.map 함수를 재정의 할 수있는 것과 동일한 방식으로 여전히 사용됩니다.
또는 내가 믹스 인으로 사용한 것처럼
_.mapobj ( options , function( val, key, list )
_.mapValues(users, function(o) { return o.age; });
Lodash와 _.mapObject({ one: 1, two: 2, three: 3 }, function (v) { return v * 3; });
Underscore에서 사용할 수 있습니다 .
교차 문서를 확인하십시오 : http://jonathanpchen.com/underdash-api/#mapvalues-object-iteratee-identity