2017-08-25 17 views
1

我在這裏有一小段代碼,我試圖用正在映射的對象的某個屬性創建一個映射。下面是代碼:將數組映射到字典不適用於第一個對象

var operators = [ 
    { priority: 1, symbol: '-'}, 
    { priority: 1, symbol: '+'}, 
    { priority: 2, symbol: '*'} 
]; 

var foo = operators.reduce(function(map,obj) { 
    map[obj.symbol] = obj; 
    return map; 
}); 

console.log(foo); 

這段代碼的輸出是:

{ priority: 1, 
    symbol: '-', 
    '+': { priority: 1, symbol: '+' }, 
    '*': { priority: 2, symbol: '*' } } 

你可能注意到了,第一個對象是不正確映射。我試過改變順序來查看我的代碼中是否有錯字,但問題依然存在。

出了什麼問題?

+0

你需要一個初始空對象傳遞給'reduce'。 –

+0

你期待的結果是什麼? – randomguy04

回答

4

這就是你需要做什麼:

var operators = [ 
 
    { priority: 1, symbol: '-'}, 
 
    { priority: 1, symbol: '+'}, 
 
    { priority: 2, symbol: '*'} 
 
]; 
 

 
var foo = operators.reduce(function(map,obj) { 
 
    map[obj.symbol] = obj; 
 
    return map; 
 
}, {}); // pass in initial empty map object 
 

 
console.log(foo);

閱讀的reduce的說明文件initial value


如果不處於初始值傳遞然後reduce認爲陣列作爲初始值的第一個元素。因此,它將兩個新屬性添加到對象{ priority: 1, symbol: '-'}

0

除了使用Array#reduce以正確的初始值之外,您可以採用ES6並映射新對象,使用Object.assignspread syntax ...作爲新對象。

var operators = [{ priority: 1, symbol: '-'}, { priority: 1, symbol: '+'}, { priority: 2, symbol: '*'}], 
 
    object = Object.assign(...operators.map(o => ({ [o.symbol]: o}))); 
 

 
console.log(object);
.as-console-wrapper { max-height: 100% !important; top: 0; }

相關問題