[javascript] lodash : 객체에 배열 매핑

이것을 수행하는 내장 lodash 함수가 있습니까?

var params = [
    { name: 'foo', input: 'bar' },
    { name: 'baz', input: 'zle' }
];

다음을 출력합니다.

var output = {
    foo: 'bar',
    baz: 'zle'
};

지금은 다음을 사용하고 있습니다 Array.prototype.reduce().

function toHash(array, keyName, valueName) {
    return array.reduce(function(dictionary, next) {
        dictionary[next[keyName]] = next[valueName];
        return dictionary;
    }, {});
}

toHash(params, 'name', 'input');

lodash 지름길이 있는지 궁금합니다.



답변

lodash 4.17.2의 또 다른 방법

_.chain(params)
    .keyBy('name')
    .mapValues('input')
    .value();

또는

_.mapValues(_.keyBy(params, 'name'), 'input')

또는 _.reduce

_.reduce(
    params,
    (acc, { name, input }) => ({ ...acc, [name]: input }),
    {}
)


답변

배열을 객체로 쉽게 변환하려면 _.keyBy를 사용해야합니다.

여기에 문서

아래 사용 예 :

var params = [
    { name: 'foo', input: 'bar' },
    { name: 'baz', input: 'zle' }
];
console.log(_.keyBy(params, 'name'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

필요한 경우 _.keyBy를 사용하기 전에 배열을 조작하거나 _.keyBy를 사용한 후 개체를 조작하여 원하는 정확한 결과를 얻을 수 있습니다.


답변

여기 있습니다 ._.reduce

var params = [
    { name: 'foo', input: 'bar' },
    { name: 'baz', input: 'zle' }
];

_.reduce(params , function(obj,param) {
 obj[param.name] = param.input
 return obj;
}, {});


답변

이것은 Object.assign에 대한 작업처럼 보입니다.

const output = Object.assign({}, ...params.map(p => ({[p.name]: p.input})));

OP와 유사한 함수로 래핑하도록 편집하면 다음과 같습니다.

const toHash = (array, keyName, valueName) =>
    Object.assign({}, ...array.map(o => ({[o[keyName]]: o[valueName]})));

(Ben Steward에게 감사합니다, 좋은 생각 …)


답변

배열 축소 방법 및 ES6 구조 해제 와 함께 하나의 라이너 자바 스크립트를 사용 하여 키 값 쌍의 배열을 객체로 변환 할 수 있습니다.

arr.reduce((map, { name, input }) => ({ ...map, [name]: input }), {});


답변

이것은 아마도 원하는 것보다 더 장황 할 수 있지만 약간 복잡한 작업을 요구하므로 실제 코드가 관련 될 수 있습니다 (공포).

내 추천 zipObject은 매우 논리적입니다.

_.zipObject(_.map(params, 'name'), _.map(params, 'input'));

또 다른 옵션은 더 해키, 사용 fromPairs:

_.fromPairs(_.map(params, function(val) { return [val['name'], val['input']));

익명 함수는 해킹을 보여줍니다. JS가 객체 반복에서 요소의 순서를 보장한다고 믿지 않으므로 callling은 수행하지 않습니다 .values().


답변

lodash의 또 다른 방법

쌍을 만든 다음 개체를 구성하거나 ES6 Map쉽게

_(params).map(v=>[v.name, v.input]).fromPairs().value()

또는

_.fromPairs(params.map(v=>[v.name, v.input]))

다음은 작동하는 예입니다.