使用Ramda将对象数组转换为嵌套对象

时间:2020-09-24 07:54:27

标签: javascript typescript ramda.js

我是新手,所以请问我一个幼稚的问题。

我有一个对象数组

const arr = [{id: 1, name: 'Pete'}, {id: 5, name: 'John'}, {id: 3, name: 'Peter'}]

我想使用ramda将其转换为这种形式:

const obj = {1 : {id: 1, name: 'Pete'}, 5: {id: 5, name: 'John'}, 3: {id: 3, name: 'Peter'}} 

有人可以帮忙吗?

其他概念性问题:

  1. 我想将嵌套的对象数组转换为这种形式,因为如果给定name,搜索id的方法将很快。这是正确的方法吗?
  2. 还有其他有效的方法可以使数组中的搜索更快吗?

谢谢

4 个答案:

答案 0 :(得分:3)

您可以使用ramda的R.indexBy:

const arr = [{id: 1, name: 'Pete'}, {id: 2, name: 'John'}, {id: 3, name: 'Peter'}]

const result = R.indexBy(R.prop('id'))(arr)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.min.js" integrity="sha512-rZHvUXcc1zWKsxm7rJ8lVQuIr1oOmm7cShlvpV0gWf0RvbcJN6x96al/Rp2L2BI4a4ZkT2/YfVe/8YvB2UHzQw==" crossorigin="anonymous"></script>

我想将嵌套的对象数组转换为这种形式,因为 如果给出id,搜索名称的方法将很快。这是对的吗 方法?

从数组中获取项目通常为O(n)。从属性(字典)中获取属性的项的索引为O(1),因此,如果要通过id获取名称,则对象获胜...。但是,如果要按名称查找对象,则应按name属性建立索引。另外,您要查找确切的名称吗?或包含某些内容的名称。如果搜索是名称的一部分,那么您仍然需要迭代所有O(n),并且数组也应该很好。

还有其他有效的方法可以使性能 搜索数组更快?

实际上,这取决于您要进行的搜索方式以及要搜索的项的数量,如果您的搜索量小于50,000,并且搜索id,则可以使用对象或地图,通过名称的一部分-数组就可以了。但是,在遇到实际问题之前,不要试图进行优化,先对其进行概要分析,然后发现搜索应归咎于此。

答案 1 :(得分:1)

没有ramda,您可以使用内置Object.fromEntriesid与对象的映射。

const
    array = [{ id: 1, name: 'Pete' }, { id: 2, name: 'John' }, { id: 3, name: 'Peter' }],
    object = Object.fromEntries(array.map(o => [o.id, o]));

console.log(object[2].name);
console.log(object);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 2 :(得分:0)

您可以在此处使用Map以获得更好的性能。

const map = new Map();
const arr = [{id: 1, name: 'Pete'}, {id: 2, name: 'John'}, {id: 3, name: 'Peter'}]

for(const {id, name} of arr){
  map.set(id, name);
}

//check id exists 
map.has(1)  // true
//get person's name
map.get(1) //"Pete"

答案 3 :(得分:-1)

您可以尝试使用过滤器-这样会使原始数组保持不变,并返回具有匹配项的新数组:

const arr = [{id: 1, name: 'Pete'}, {id: 2, name: 'John'}, {id: 3, name: 'Peter'}]


let filtered = arr.filter(a => a.id == 1);
console.log(filtered);