-1

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

我可以更改密钥对数据的存储方式以提高访问效率吗?

我尝试使用答案中建议的函数,但它给了我一个错误,说 id is not defined:

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

1 回答 1

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. 哪个更好取决于上下文。

于 2014-01-25T12:09:43.703 回答