JavaScript - 将数组转换为 map

标签 javascript functional-programming ramda.js

给定一个对象数组:

var projects = [
    {
        id: 1,
        name: 'Trader Portal'
    },
    {
        id: 2,
        name: 'Risk Engine'
    },
];

将其转换为以下结构的最优雅方法是什么——本质上是 ID 数组以及对象映射:

{
    projects: [
        1,
        2
    ],
    projectMap: {
        1: {
            id: 1,
            name: 'Trader Portal'
        },
        2: {
            id: 2,
            name: 'Risk Engine'
        }
    }
}

我使用下划线(见下文或我的 codepen )做到了这一点,但有更好的方法吗?例如,这可以使用函数式编程以更具声明性的方式完成吗?有没有一种方法可以通用化代码以处理任何类型对象的数组?

var projects = [
    {
        id: 1,
        name: 'Trader Portal'
    },
    {
        id: 2,
        name: 'Risk Engine'
    },
];

var result = {};

result.projects = _.map(projects, function(project) {
  return project.id;
});

result.projectMap = {};
_.each(projects, function(project) {
  result.projectMap[project.id] = project;
});

console.log(JSON.stringify(result));

最佳答案

如果您只对 @jeremija 中的第二个示例感兴趣,那么 Ramda 有一个内置函数,indexBy ,您可以使用 like this :

R.indexBy(R.prop('id'), projects);

关于JavaScript - 将数组转换为 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37657865/

相关文章:

javascript - 原型(prototype)选择器

php - 通过 AJAX 调用终止服务器上的 PHP 脚本

javascript - 在 Ramda.js 中按属性过滤对象

javascript - Selenium driver.get() 在函数组合下不起作用

scala - 在Coalgebras上使用Tagless Final(对象代数)可以吗?

javascript - 在 ramda.js 中使用嵌套字段进行排序

javascript - 在 jQuery 中删除元素的问题

javascript - 在路由器 Action 中加载组件与路由器初始化之前加载组件的优缺点

javascript - JavaScript 和 ES6 中柯里化(Currying)函数的函数应用

haskell - 从元组列表中获取唯一路径