[javascript] 객체 보존 키로 매핑

그만큼 mapunderscore.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 }

DEMO


Lodash

Lodash는 _.mapValues값을 매핑하고 키를 유지 하는 기능 을 제공 합니다.

_.mapValues({ one: 1, two: 2, three: 3 }, function (v) { return v * 3; });

// => { one: 3, two: 6, three: 9 }

DEMO


답변

밑줄과 비슷한 유틸리티 라이브러리 인 lodash에서 필요한 기능을 찾을 수있었습니다.

http://lodash.com/docs#mapValues

_.mapValues(object, [callback=identity], [thisArg])

콜백을 통해 객체의 열거 가능한 각 속성을 실행하여 생성 된 객체 및 값과 동일한 키로 객체를 만듭니다. 콜백은 thisArg에 바인딩되며 세 개의 인수로 호출됩니다. (값, 키, 객체).


답변

var mapped = _.reduce({ one: 1, two: 2, three: 3 }, function(obj, val, key) {
    obj[key] = val*3;
    return obj;
}, {});

console.log(mapped);
<script src="http://underscorejs.org/underscore-min.js"></script>
<script src="https://getfirebug.com/firebug-lite-debug.js"></script>


답변

나는 이것이 오래되었다는 것을 알고 있지만 이제 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);
}


답변

일반 JS ( ES6 / ES2015 ) 에서이 버전은 어떻습니까?

let newObj = Object.assign(...Object.keys(obj).map(k => ({[k]: obj[k] * 3})));

jsbin

객체를 재귀 적으로 매핑하려면 (중첩 된 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;
};

jsbin

이후 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결과적으로 배열을 가지고 무언가를 만들 것으로 기대할 때 혼란 스럽 습니다.