2013-11-14 73 views
5

因此,下劃線中的_.map()函數不返回對象,但它需要它們。有沒有什麼辦法讓它返回完全相同的對象?從_.map()返回對象

var _ = require("underscore"); 

var cars = { 
    "mom": { 
     "miles": "6", 
     "gas": "4" 
    }, 
    "dad": { 
     "miles": "6", 
     "gas": "4" 
    } 
} 

var regurgitate_cars = _.map(cars, function(value, key){ 
    return value; 
}); 

/* 
[ { miles: '6', gas: '4' }, { miles: '6', gas: '4' } ] 
*/ 

var regurgitate_cars = _.map(cars, function(value, key){ 
    var transfer = {}; 
    transfer[key] = value; 
    return transfer; 
}); 

/* 
[ { mom: { miles: '6', gas: '4' } }, 
    { dad: { miles: '6', gas: '4' } } ] 
*/ 
+0

你想達到什麼目的?淺/深複製一個對象? –

+1

查看地圖價值的下劃線https://github.com/jashkenas/underscore/issues/220 – megawac

回答

6

您可以使用_.object()將其重新轉換爲對象。

var regurgitate_cars = _.object(
    _.map(cars, function(value, key){ 
     return [key, value]; 
    }) 
); 

至於這樣做,直接與_.map,你就必須重寫地圖去做。

+2

你需要'返回[鍵,價值]'這個工作......? – McGarnagle

+0

@McGarnagle,很好的電話。你是對的,而且這個帖子已經更新了。它看起來更簡潔。 – EmptyArsenal

1

map返回array所以沒有辦法,你可以得到它的返回與出寫自己原來的對象。見documentation

通過經由 變換函數(迭代)繪製列表中的每個值將產生的值的一個新的數組。如果本地映射方法存在,則將使用 。如果list是一個JavaScript對象,迭代器的 參數將是(value,key,list)。

0

無法用當前的映射實現返回對象。 It's been suggested該庫添加一個.mapValues()函數,它可以做你喜歡的。這裏是你如何把它添加到您的代碼:

_.mixin({ 
    mapValues: function (input, mapper) { 
     return _.reduce(input, function (obj, v, k) { 
      obj[k] = mapper(v, k, input); 
     }, {}); 
    } 
}); 

現在你可以使用mapValues返回一個新的對象:

var regurgitate_cars = _.mapValues(cars, function(value, key){ 
    return value; 
}); 
5

_.map()總是會返回一個數組,但你可以得到與_.reduce()行爲:

var regurgitateCars = _.reduce(cars, function(memo, value, key) { 
    memo[key] = value; 
    return memo; 
}, cars); 

注意,這將修改並返回原來的對象,如果你想要一個副本,你可以提供一個空的對象作爲第三個參數,這將b e用作第一次撥打匿名功能時的參數memo

var regurgitateCars = _.reduce(cars, function(memo, value, key) { 
    memo[key] = value; 
    return memo; 
}, {});