簡體   English   中英

Underscore.js:使用對象中的鍵創建對象列表中的地圖

[英]Underscore.js: create a map out of list of objects using a key found in the object

我正在使用優秀的Underscore.js庫。 我有一個特定的任務,我可以使用JavaScript或jQuery做得很好但是想知道在Underscore中是否有某種抽象可以讓我錯過了。

基本上我有一個像這樣的對象 -

var some_object_array = [{id: "a", val: 55}, {id: "b", val: 1}, {id: "c", val: 45}];

我想把它轉換成 -

var some_map = {"a": {id: "a", val: 55}, "b": {id: "b", val: 1}, "c": {id: "c", val: 45}};

我知道我可以使用_.groupBy(some_object_array, "id") 但這會返回如此的地圖 -

var some_grouped_map = {"a": [{id: "a", val: 55}], "b": [{id: "b", val: 1}], "c": [{id: "c", val: 45}]};

請注意,這會做廣告宣傳的內容。 但我希望得到some_map而不是自己迭代對象。

任何幫助贊賞。

對於它的價值,因為underscore.js你現在可以使用_.object()

var some_map = _.object(_.map(some_object_array, function(item) {
   return [item.id, item]
}));

對於您的情況,您應該使用indexBy函數:

var some_object_array = [{id: "a", val: 55}, {id: "b", val: 1}, {id: "c", val: 45}];

var some_grouped_map = _.indexBy(some_object_array, 'id');

還有這種方法

_.reduce(data, function (o, item) { o[item.key] = item.value; return o }, {})

哪個是內部函數中有兩個語句的語句。

我不認為有什么比groupBy更接近你的需求。 即使有,它也不會比簡單更好:

var some_map = {};
_.each(some_object_array, function(val) {
  some_map[val.id] = val;
});

在這種情況下,您不需要迭代數組。 不是map ,不是reduce ,不是transform 你需要的只是舊的pluck

_.object(_.pluck(some_object_array, 'id'), some_object_array);

對於ES6,它是

var some_map = _.chain(some_object_array)
                .map(item => [item.id, item])
                .object()
                .value()

我使用lodash解決了這個問題:

 const ar = [ { key: '1', val: 'a' }, { key: '2', val: 'b' }, { key: '3', val: 'c' } ] const obj = _.keyBy({ ...ar }, 'key') console.log(obj) 
 <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.5/lodash.min.js"></script> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM