이것을 수행하는 내장 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에게 감사합니다, 좋은 생각 …)
답변
답변
이것은 아마도 원하는 것보다 더 장황 할 수 있지만 약간 복잡한 작업을 요구하므로 실제 코드가 관련 될 수 있습니다 (공포).
내 추천 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]))
다음은 작동하는 예입니다.