2016-03-30 81 views
1

我正在尋找一種方法來獲取JavaScript對象數組並獲取由某些屬性鍵入的那些對象的關聯數組。Javascript:將對象列表轉換爲關聯數組

例如,假設該數組對象:

var data = [ 
    {'id': 100, name: 'bob', foo: 'bar'}, 
    {'id': 200, name: 'john', foo: 'qux'} 
]; 

我希望能夠通過它的ID每個對象看,所以我希望對象是這樣的:

var new_data = { 
    100: {name: 'bob', foo: 'bar'}, 
    200: {name: 'john', foo: 'qux'} 
} 

// now I can use new_data[200] to access `john` 

雖然我確信很容易構建一個新對象,然後迭代原始數組中的每個對象,並將一個新的鍵:值對添加到新對象,我想知道是否有更簡潔的方法。

+0

它並沒有比這更簡潔。我不知道這樣做的原生函數,但實現它很簡單。 –

+0

謝謝亞歷山大,我會寫我自己的幫手。我不確定Javascript是否有類似於Python的字典解析的東西。我看到Underscore.js有一個函數,可以實現我想稱爲「indexBy」的功能,所以假設他們已經在該庫中實現了它,肯定不會有本地的東西。 – Joseph

+0

[沒有這樣的東西作爲「JSON對象」](http://benalman.com/news/2010/03/theres-no-such-thing-as-a-json/) – Andreas

回答

5

在ES6:

Object.assign({}, ...data.map(({id, name, foo}) => ({[id]: {name, foo}}))) 

這將映射在輸入與id作爲鍵的單屬性對象中的每個對象,然後傳播到那些參數Object.assign將它們粘合在一起爲您服務。

或者,

構造一個新的對象,然後遍歷原始數組中的每個對象和一個新的密鑰追加:值對新對象

你可以做實際上你剛纔所述但在相對簡潔的形式使用reduce

data.reduce((result, {id, name, foo}) => { 
    result[id] = {name, foo}; 
    return result; 
}, {}) 
+0

我會使用'Map '對於ES6版本:'new Map(data.map(x => [x。id,x]))' – georg

+0

@georg這很好。 –

0

下面是使用陣列地圖的溶液:

var data = [{ 
    'id': 100, 
    name: 'bob', 
    foo: 'bar' 
}, { 
    'id': 200, 
    name: 'john', 
    foo: 'qux' 
}]; 

var new_data = {}; 
// Iterate over data 
data.map(obj => { 
    // Create new object from old 
    new_data[obj.id] = { 
    'name': obj.name, 
    'foo': obj.foo 
    } 

}); 


console.log(new_data); 
0

在ES5: 工作JSBIN:https://jsbin.com/qudeze/edit?js,console

var data = [ 
    {'id': 100, name: 'bob', foo: 'bar'}, 
    {'id': 200, name: 'john', foo: 'qux'} 
]; 


var new_data = { 
    100: {name: 'bob', foo: 'bar'}, 
    200: {name: 'john', foo: 'qux'} 
}; 

var y = data.reduce(function(result, next) { 
    result[next.id] = {name: next.name, foo: next.foo}; 
    return result; 
}, {}); 


console.log(y); 
1

你可以試試這個:

var data = [ 
    {'id': 100, name: 'bob', foo: 'bar'}, 
    {'id': 200, name: 'john', foo: 'qux'} 
]; 

data.reduce(function(p, c){ 
    p[c.id] = {name:c.name, foo: c.foo}; 
    return p; 
}, {}); 
0

你的代碼應該是這樣的....

<script type="text/javascript"> 
    var data = [ 
      {'id': 100, name: 'bob', foo: 'bar'}, 
      {'id': 200, name: 'john', foo: 'qux'} 
     ]; 

    var new_data = {}; 
    for(var i=0; i<data.length; i++){ 
     var element = {}; 
     element["name"] = data[i].name; 
     element["foo"] = data[i].foo; 
     new_data[data[i].id] = element;    
    } 
console.log(JSON.stringify(new_data)); 
0

我不認爲我們可以使用地圖方法。因爲我們的輸出不是一個數組而是一個對象。我們可以使用每種方法來幫助我們。以下是一個示例代碼:

var data = [ 
    {'id': 100, name: 'bob', foo: 'bar'}, 
    {'id': 200, name: 'john', foo: 'qux'} 
]; 

var result = {}; 

data.forEach(function(item){ 
    var key = item.id; 

    //remove id from item 
    delete item.id; 

    result[key] = item; 
}); 

console.log(result); 

注意,此解決方案將修改原始數組。如果你不想改變原來的一個,只需複製一個。