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

Javascript 使用Ramda将对象数组转换为嵌套对象,javascript,typescript,ramda.js,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'}} 有人能帮忙吗 其他概念问题: 我想将对象

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

我有一个对象数组

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'}} 
有人能帮忙吗

其他概念问题:

我想将对象的嵌套数组转换为这种形式,因为如果给定id,搜索名称的方式会很快。这是正确的方法吗? 在性能方面,还有其他有效的方法可以使数组中的搜索更快吗?
感谢没有ramda,您可以使用内置id和对象映射

常数 数组=[{id:1,名称:'Pete'},{id:2,名称:'John'},{id:3,名称:'Peter'}], object=object.fromEntriesarray.mapo=>[o.id,o]; console.logobject[2]。名称; console.logobject;
.作为控制台包装器{max height:100%!important;top:0;}如果没有ramda,您可以使用具有id和对象映射的内置

常数 数组=[{id:1,名称:'Pete'},{id:2,名称:'John'},{id:3,名称:'Peter'}], object=object.fromEntriesarray.mapo=>[o.id,o]; console.logobject[2]。名称; console.logobject;
.作为控制台包装{max height:100%!important;top:0;}您可以使用ramda的R.indexBy:

const arr=[{id:1,名字:'Pete'},{id:2,名字:'John'},{id:3,名字:'Peter'}] const result=R.indexByR.prop'id'arr console.logresult
您可以使用ramda的R.indexBy:

const arr=[{id:1,名字:'Pete'},{id:2,名字:'John'},{id:3,名字:'Peter'}] const result=R.indexByR.prop'id'arr console.logresult
您可以尝试使用筛选器-这将保留原始数组不变,并返回一个包含匹配项的新数组:

const arr=[{id:1,名字:'Pete'},{id:2,名字:'John'},{id:3,名字:'Peter'}] 让filtered=arr.filtera=>a.id==1;
console.logfiltered 您可以尝试使用筛选器-这将保留原始数组不变,并返回一个包含匹配项的新数组:

const arr=[{id:1,名字:'Pete'},{id:2,名字:'John'},{id:3,名字:'Peter'}] 让filtered=arr.filtera=>a.id==1; console.logfiltered 您可以在此处使用,以获得更好的性能

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 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"


非常感谢你。你能回答概念性问题吗@菜鸟,你有身份证并且想搜索名字吗?或者你只有一个名字,想要这个对象/id吗?我有一个id,我想得到name@newbie,只需将id作为,然后命名为Property。非常感谢。你能回答概念性问题吗@菜鸟,你有身份证并且想搜索名字吗?或者你只有一个名字,想要这个对象/id吗?我有一个id,我想得到name@newbie,只需将id设为,然后命名为propery。为什么John的id在输入中为2,而在预期输出中为5?一个打字错误,还是背后的逻辑?一个打字错误。。更正了为什么John的id 2在输入中,而5在预期输出中?一个打字错误,还是背后的逻辑?一个打字错误。。更正请注意,您的输出与OPA中的预期输出完全不同。要求是他希望在原始数组中搜索名称,唯一的解决方案是将数组转换为不同的格式。我的建议是一个简单的filterOP显式地提供预期的输出:我想使用ramda:const obj={1:{id:1,name'Pete'},5:{id:5,name'John'},3:{id:3,name'Peter'}将其转换为这种形式-与您的结果进行比较此语句包括:我想将对象的嵌套数组转换为此表单,因为如果给定id,搜索名称的方式会很快。这是正确的方法吗?使用过滤器是一种方法选择,他可以考虑。几乎不值得将其标记为删除。因此,您应该明确回答问题的这一特定部分,并解释为什么它与OP中提出的方法不同。请注意,您的输出与OP中的预期输出完全不同。要求是他希望在原始数组中搜索名称,并他唯一的解决办法就是将数组转换成不同的格式。我的建议是一个简单的filterOP显式地提供预期的输出:我想使用ramda:const obj={1:{id:1,name'Pete'},5:{id:5,name'John'},3:{id:3,name'Peter'}将其转换为这种形式-与您的结果进行比较此语句包括:我想将对象的嵌套数组转换为此表单,因为如果给定id,搜索名称的方式会很快。这是正确的方法吗?使用过滤器是一种方法选择,他可以考虑。几乎不值得将其标记为删除。因此,您应该明确回答问题的这一特定部分,并解释为什么它与OP中提出的方法不同。非常感谢。你能回答概念性问题吗@新手:请记住最后一句话:但是,在你真正遇到问题之前,不要尝试优化,你分析了它,发现搜索是罪魁祸首。视乎

你的阵型大小,在阵型上找到一个可能足够快;如果一个数组中有2000个对象,这很可能是过早的优化。我应该把对象数组改成嵌套对象吗?@newbie:你测试过最简单的东西吗,arr.find{id}=>id==query?速度够快吗?如果是这样的话,我就不会费心做任何优化了。我的猜测是,对于2000个对象,它将非常快,除非你是在一个紧密的循环中进行。谢谢@ScottSauyet:非常感谢。你能回答概念性问题吗@新手:请记住最后一句话:但是,在你真正遇到问题之前,不要尝试优化,你分析了它,发现搜索是罪魁祸首。根据阵列的大小,阵列上的查找速度可能足够快;如果一个数组中有2000个对象,这很可能是过早的优化。我应该把对象数组改成嵌套对象吗?@newbie:你测试过最简单的东西吗,arr.find{id}=>id==query?速度够快吗?如果是这样的话,我就不会费心做任何优化了。我的猜测是,对于2000个对象,它将非常快,除非您在一个紧密的循环中执行此操作。感谢@ScottSauyet:Map也保留了原始顺序。这比我所问的将其转换为基于json的嵌套对象好吗?我相信这是一种更具伸缩性的方法。比如说,如果您想添加另一个名称,您可以使用map.setid来添加,nameMap也保留了原始顺序。这比我所问的将其转换为基于json的嵌套对象好吗?我相信这是一种更具伸缩性的方法。假设您想添加另一个名称,只需使用map.setid,name即可