Javascript Array.prototype.reduce()减少了signe nubmer而不是object

时间:2017-08-24 10:28:40

标签: javascript reduce

我正在 Chrome控制台上测试方法的原型,并获得有关 Array.prototype.reduce()

的意外结果

例如下面的例子

{
  "a": 1,
  "b": 1,
  "c": 1
}

我期望得到的结果是

{{1}}

但我得到的值 1

4 个答案:

答案 0 :(得分:5)

您还需要在每次迭代中返回累加器。

let a = [["a",1],["c",1],["d",1]];

let result = a.reduce((acc, e) => (acc[e[0]]=e[1], acc), {});
console.log(result)

您还可以在第二个参数上使用解构赋值来获取每个数组的第一个和第二个元素。

let a = [["a",1],["c",1],["d",1]];

let result = a.reduce((acc, [a, b]) => (acc[a] = b, acc), {});
console.log(result)

答案 1 :(得分:3)

因为您需要从回调中返回累积的对象:

let result = a.reduce((acc, e) => {
  acc[e[0]] = e[1];
  return acc;
}, {});

答案 2 :(得分:3)

虽然可以使用reduce来实现这一点(see sp00m's answer),但它并不合适,并且很容易忘记从acc返回acc[e[0]] = e[1]每次回调。 (在你的情况下,因为你没有使用简洁的箭头,你在每个阶段返回reduce的结果。)forEach对于累加器更改时很有用

这只是let a = [["a",1],["b",1],["c",1]]; let result = {}; a.forEach(e => result[e[0]] = e[1]); 的一个案例:

    @using (Html.BeginForm("Method", "Controller", FormMethod.Get))
        {
         <input type="datetime" name="date" placeholder="Type the date"/>
<button type="submit" class="btn btn-default">
           Submit
        </button>
}

答案 3 :(得分:0)

您应该将代码更改为:

let result = a.reduce((acc, e) => {acc[el[0]]=e[1]; return acc}, {});

为什么:

acc[e[0]]=e[1] //this returns 1 not the acc