我这里有一小段代码,我正在尝试使用正在映射的对象的一个属性创建一个映射。这是代码:
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 :(得分: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
的{{1}}文档。
如果未传入初始值,则reduce
会将数组的第一个元素视为初始值。因此,它为对象{ priority: 1, symbol: '-'}
添加了两个新属性。
答案 1 :(得分:0)
除了使用具有正确初始值的Array#reduce
之外,您还可以使用ES6并映射新对象,并使用Object.assign
和spread 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; }