我正在尝试做类似这个问题的事情:
Can I change the way key pair data is stored to make the access very efficient?
我尝试使用答案中建议的功能,但它给出了一个错误,说明id未定义:
var userMap = userdata1.reduce(function(rv, v) {
rv[v[id]] = v;
return rv;
}, {});
用户提到_lodash与.reduce类似。
我可以使用_lodash做同样的事情来改变:
var userdata1 =
[
{"id":"527ddbd5-14d3-4fb9-a7ae-374e66f635d4","name":"xxx"},
{"id":"e87c05bc-8305-45d0-ba07-3dd24438ba8b","name":"yyy"}
]
进入某个对象我可以找到这样的名字:
var theName = userdata1["527ddbd5-14d3-4fb9-a7ae-374e66f635d4"]
答案 0 :(得分:1)
这是一个完整的解决方案:
var _ = require("lodash");
var userdata1 =
[
{"id":"527ddbd5-14d3-4fb9-a7ae-374e66f635d4","name":"xxx"},
{"id":"e87c05bc-8305-45d0-ba07-3dd24438ba8b","name":"yyy"}
];
var userMap = _.reduce(userdata1, function(rv, v) {
rv[v.id] = v.name;
return rv;
}, {});
console.log(userMap["527ddbd5-14d3-4fb9-a7ae-374e66f635d4"]);
console.log(userMap["e87c05bc-8305-45d0-ba07-3dd24438ba8b"]);
一些注意事项:
我已根据要求添加了lodash,但您可以使用userdata1.reduce
进行此操作。
在您传递给reduce
的函数中,您正在执行rv[v[id]]
。这就是你得到undefined
的原因。代码没有从"id"
中寻找名为v
的字段,它正在尝试解析当前范围中名为id
的符号,并且未找到使用此名称定义的任何内容。
对anynymous函数的唯一其他修改是将v.name
绑定到结果对象而不是v
,以便根据问题中的请求获得名称访问userMap
对象时。
根据您的使用模式,在Object.create(null)
的通话中使用{}
而不是reduce
可能更好。哪个更好取决于背景。