基于数组构建字典对象 Creating a dictionary Object from an Array
最后更新于:2022-04-01 10:49:45
## 问题 Problem
你有一个对象数组,例如:
You have an Array of Objects, such as:
~~~
cats = [
{
name: "Bubbles"
age: 1
},
{
name: "Sparkle"
favoriteFood: "tuna"
}
]
~~~
但是你想像放字典一样访问它,例如`cat["Bubbles"]`。
But you want to access it as a dictionary by key, like`cats["Bubbles"]`.
## 方法 Solution
你需要把数组转化成一个对象,使用reduce来实现。
You need to convert your array into an Object. Use reduce for this.
~~~
# key = The key by which to index the dictionary
Array::toDict = (key) ->
@reduce ((dict, obj) -> dict[ obj[key] ] = obj if obj[key]?; return dict), {}
~~~
用法:
To use this:
~~~
catsDict = cats.toDict('name')
catsDict["Bubbles"]
# => { age: 1, name: "Bubbles" }
~~~
## Discussion
Alternatively, you can use an Array comprehension:
~~~
Array::toDict = (key) ->
dict = {}
dict[obj[key]] = obj for obj in this when obj[key]?
dict
~~~
如果你使用Underscore.js,你可以创建一个mixin:
If you use Underscore.js, you can create a mixin:
~~~
_.mixin toDict: (arr, key) ->
throw new Error('_.toDict takes an Array') unless _.isArray arr
_.reduce arr, ((dict, obj) -> dict[ obj[key] ] = obj if obj[key]?; return dict), {}
catsDict = _.toDict(cats, 'name')
catsDict["Sparkle"]
# => { favoriteFood: "tuna", name: "Sparkle" }
~~~