我可以使用_lodash来简化使用.reduce处理对象数组的方式吗?

时间:2014-01-24 06:20:49

标签: javascript lodash

我正在尝试做类似这个问题的事情:

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

1 个答案:

答案 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"]);

一些注意事项:

  1. 我已根据要求添加了lodash,但您可以使用userdata1.reduce进行此操作。

  2. 在您传递给reduce的函数中,您正在执行rv[v[id]]。这就是你得到undefined的原因。代码没有从"id"中寻找名为v的字段,它正在尝试解析当前范围中名为id的符号,并且未找到使用此名称定义的任何内容。

  3. 对anynymous函数的唯一其他修改是将v.name绑定到结果对象而不是v,以便根据问题中的请求获得名称访问userMap对象时。

  4. 根据您的使用模式,在Object.create(null)的通话中使用{}而不是reduce可能更好。哪个更好取决于背景。