2016-11-11 24 views
0

我想這樣做幾乎這個用戶希望做同樣的事情:Underscore.js: create a map out of list of objects using a key found in the object在地圖上添加一個對象(不使用下劃線)

只有...

  • 我不想使用下劃線庫或jQuery。只是普通的老JS。
  • 我不希望我的對象鍵是一個字符串

所以,如果我有一個像這樣的對象 -

var some_object_array = [{id: 1, val: 55}, {id: 2, val: 1}, {id: 3, val: 45}]; 

我想這個轉換成 -

var some_map = {1: {id: 1, val: 55}, 2: {id: 2, val: 1}, 3: {id: 3, val: 45}}; 

另外,如果這是一個愚蠢的問題,我很抱歉。我是JS新手,在過去的兩個小時裏我一直在想這個問題,並一直得到錯誤的結果。我設法返回一個對象,看起來像這樣:

{ '1': [ { id: 1, val: 55 } ], 
    '2': [ { id: 2, val: 1 } ], 
    '3': [ { id: 3, val: 45 } ] } 

我的代碼:

var some_object_array = [ {id: 1, val: 55}, 
          {id: 2, val: 1}, 
          {id: 3, val: 45} 
         ]; 


function groupBy(array, callback) { 
    return array.reduce(function (result, item) { 
    var key = callback(item); 
    result[key] = item[key] || []; 
    result[key].push(item); 
    return result; 
    }, {}); 
} 


console.log(groupBy(some_object_array, function(i) { return i.id; })); 

不太正確。我的內部對象在數組中,我的密鑰被轉換爲一個字符串。不奇怪,但我只是不知道如何修改我的代碼。

回答

0

你已經過了複雜的事情了。

您只需將項目分配給結果[鍵]即可。

var some_object_array = [ 
 
    {id: 1, val: 55}, 
 
    {id: 2, val: 1}, 
 
    {id: 3, val: 45} 
 
]; 
 

 

 
function groupBy(array, callback) { 
 
    return array.reduce(function (result, item) { 
 
    var key = callback(item); 
 
    result[key] = item; 
 
    return result; 
 
    }, {}); 
 
} 
 

 
var r = groupBy(some_object_array, function(i) { return i.id; }); 
 
console.log(r); 
 
//now lets get item with id 2 
 
console.log(r[2]);

+0

哦,我想結果[關鍵] =項[關鍵],但讓這麼多的感覺。但是,我的對象鍵(1,2,3)仍然顯示爲一個字符串。任何想法如何解決這個問題。這讓我感到困惑,因爲我認爲對象鍵總是字符串......所以......我如何「解開」一個鍵? – DeeK

+1

我不確定你的意思。關鍵在於這種形式。如果你看JSON,一個關鍵總是要雙引號。如果您使用整數查找,不要擔心它仍然會工作..我會更新我的答案來顯示此。 – Keith

0

var objArr = [{id: 1, val: 55}, {id: 2, val: 1}, {id: 3, val: 45}]; 
 
var some_map = {1: {id: 1, val: 55}, 2: {id: 2, val: 1}, 3: {id: 3, val: 45}}; 
 

 
// Initialize empty object literal: 
 
let objMap = {}; 
 

 
for (let i = 0; i < objArr.length; i++) { 
 
    let key = objArr[i].id; 
 
    objMap[key] = objArr[i]; 
 
} 
 

 
console.log('Object Map:\n', objMap); 
 
/* Object Map: 
 
{ 
 
    "1": { 
 
    "id": 1, 
 
    "val": 55 
 
    }, "2": { 
 
    "id": 2, 
 
    "val": 1 
 
    }, "3": { 
 
    "id": 3, 
 
    "val": 45 
 
    } 
 
} 
 
*/