将数组映射到字典不适用于第一个对象

时间:2017-08-25 02:07:20

标签: javascript

我这里有一小段代码,我正在尝试使用正在映射的对象的一个​​属性创建一个映射。这是代码:

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: '*' } }

正如您所注意到的,第一个对象未​​正确映射。我已经尝试更改顺序,看看我的代码中是否有拼写错误,但问题仍然存在。

有什么问题?

2 个答案:

答案 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.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; }