2016-11-11 64 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 
 
    } 
 
} 
 
*/