首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过Lodash从Array创建对象映射

通过Lodash从Array创建对象映射
EN

Stack Overflow用户
提问于 2018-04-23 15:23:21
回答 2查看 1.3K关注 0票数 1

我有一个由nameagedepartment组成的数组数组

代码语言:javascript
运行
复制
[[ "Kevin", 22,"Psychology" ],
[ "Cathy", 26, "Psychology" ],
[ "David", 31, "Engineering" ],
[ "Christine", 23, "Engineering" ]]

我想创建一个基于唯一的departments的地图,如下所示:

代码语言:javascript
运行
复制
{ Psychology: [ 
  { name: "Cathy", age: 26 }, 
  { name: "Kevin", age: 22 } ] 
},
{ Engineering: [ 
  { name: "Christine", age: 23 }, 
  { name: "David", age: 31 } ] 
}

数组中的department索引总是相同的。如何利用lodash实现这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-23 15:33:43

在不使用外部库的情况下,使用这样的新ESNext非常容易。

代码语言:javascript
运行
复制
const data = [
[ "Kevin", 22,"Psychology" ],
[ "Cathy", 26, "Psychology" ],
[ "David", 31, "Engineering" ],
[ "Christine", 23, "Engineering" ]];

const result = data.reduce((a, v) => {
  const [name,age,dept] = v; 
  (a[dept] = a[dept] || []).push({name,age});
  return a;
}, {});

console.log(result);

票数 4
EN

Stack Overflow用户

发布于 2018-04-23 16:25:19

这里有一个房客解决方案:

代码语言:javascript
运行
复制
const {flow, groupBy, nth, mapValues, map, zipObject} = _

const transform = flow(
  people => groupBy(people, p => nth(p, 2)),
  grouped => mapValues(grouped, dept => map(
    dept, 
    person => zipObject(['name', 'age'], person)
  ))
)

const people = [["Kevin", 22, "Psychology"], ["Cathy", 26, "Psychology"], ["David", 31, "Engineering"], ["Christine", 23, "Engineering"]]

console.log(transform(people))
代码语言:javascript
运行
复制
<script src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>

它可能会变得更简单,但我从来没有得到正确的工作。我可能没有花太多时间在上面,因为我是JS,兰达的另一个FP库的作者之一。上面的解决方案是通过翻译我用Ramda编写的第一段代码来创建的:

代码语言:javascript
运行
复制
const {pipe, groupBy, nth, map, zipObj} = R;

const transform = pipe(
  groupBy(nth(2)),
  map(map(zipObj(['name', 'age'])))
)

const people = [["Kevin", 22, "Psychology"], ["Cathy", 26, "Psychology"], ["David", 31, "Engineering"], ["Christine", 23, "Engineering"]]

console.log(transform(people))
代码语言:javascript
运行
复制
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.js"></script>

我猜想,尽管您必须用mapValues替换第一个mapValues,但该代码看起来可能非常相似。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49984612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档