繁体   English   中英

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

[英]Transform array of objects to nested objects using Ramda

我是新手,如果我问一个幼稚的问题,请原谅我。

我有一个对象数组

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. 我想将嵌套的对象数组转换为这种形式,因为如果给出了id那么搜索name会很快。 这是正确的方法吗?
  2. 有没有其他有效的性能方式可以使数组中的搜索更快?

谢谢

您可以使用 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 并且搜索 hy id - 一个对象或地图就可以了,通过名称的一部分 - 一个数组就可以了。 但是,在您真正遇到问题之前不要尝试优化,您对其进行了分析,并发现搜索是罪魁祸首。

如果没有 ramda,您可以使用内置Object.fromEntriesid和 object 的映射。

 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; }

您可以在此处使用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"

您可以尝试使用过滤器 - 这会使原始数组保持不变并返回一个包含匹配项的新数组:

 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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM