2014-03-29 127 views
1

我想從一個已經存在的對象和數組中創建一個具有修改過的屬性名稱的對象。如何從數組和已有對象創建新對象?

var ExistingObj = {'123' : 50, '456' : 60, '789' : 90}; 
var idsArr = ['123', '456', '789']; 

我想創建一個對象包含以下內容的數組:

var newArr = [{id : '123', amount: 50}, {id: '345', amount: 60}, {id:'789' : 90}]; 

我試圖映射像這樣,它不工作:

var existingObj = {'123' : 50, '456' : 60, '789' : 90}; 
var idsArr = ['123', '456', '789']; 


function formatArr(idsArr, existingObj){ 
var obj = {}; 
var container = []; 

_.map(idsArr, function(id){ 
    obj.id = id; 
    obj.amount = existingObj[id];  
    container.push(obj); 
}); 
    return container; 
} 

和結果是:

container = [{'id' : '789', 'amount' : 90}, {id : '789', 'amount' : 90}, {id:'789', 'amount' : 90}]; 

任何想法?

回答

1

您當前的方法在_.map函數中重複使用同一個對象(var obj = {};),因爲它在_.map調用之外定義。所以在每一步你修改相同的對象,然後將它推入container變量。再次。然後再次。然後再次。

這就是爲什麼你會得到一個相同記錄的數組 - 它們實際上是對同一個對象的引用。

很明顯,這是錯誤的。但更糟糕的是在_.map函數中使用push函數: 該函數的主要目的是基於其他集合構建數組,並且不需要添加自己的代碼來完成該操作。這是如何可以寫成:

function formatArr(idsArr, existingObj) { 
    return _.map(idsArr, function(id){ 
     return { 
     id: id, 
     amount: existingObj[id] 
     }); 
    }); 
} 

一點題外話,使用_.map沒有存儲其結果幾乎總是一個邏輯上的錯誤。如果您不關心迭代的結果,請使用_.each

+0

感謝您的信息!我能夠以這種方式工作: 函數formatArr(idsArr,existingObj,fn)var newArr = _.map(idsArr,function(id){ return {id:id,amount:existingObj [id] } }); fn(newArr); } – user3476766

0

感謝您的信息!我能夠以這種方式工作,因爲我在另一個函數中調用它:

function formatArr(idsArr, existingObj, fn){ 
    var newArr = _.map(idsArr, function(id){ 
    return {id: id, amount: existingObj[id]} 
    }); 
    fn(newArr); 
}