【问题标题】:How Es6 rest and spread is workingEs6 rest and spread 是如何工作的
【发布时间】:2018-01-22 02:20:30
【问题描述】:

我现在有以下代码

var _ = require('underscore');
var raw =[
  {
    key :"name",value:"henry"
  },
  {
    key :"age",value:"old"
  },
  {
    key :"food",value:"matooke"
  },
  {
    key :"kids",value:"Acacia"
  },
  {
    key :"garbageA",value:"kasailoA"
  },
  {
    key :"garbageB",value:"kasasiroB"
  },

]
const endShape = _(raw)
.filter(({key}) =>!/garbage/.test(key))
.map(({key,value})=>({[key]:value}))
.reduce((acc,curr)=>({...curr, ...acc}));

console.log(endShape);

代码运行良好,我正在学习教程。 我了解 .map() 方法。 虽然我没能清楚地解释什么

.reduce((acc,curr)=>({...curr, ...acc}));

正在做。这个正确的结果是怎么得出的?

{ kids: 'Acacia', food: 'matooke', age: 'old', name: 'henry' }

【问题讨论】:

  • 您所拥有的是 ES6 中的语法错误。如果它对您“有效”,您似乎正在使用an experimental transpiler
  • 哪个语法错误?请解释清楚
  • {...curr, ...acc} 不是有效的 ES6。
  • 让我研究一下
  • 添加到 JavaScript 的新功能将通过不同阶段进行讨论和测试:请参阅 2ality.com/2015/11/tc39-process.html

标签: javascript lambda ecmascript-6


【解决方案1】:

基本上,map 函数输出如下:

[
  {
    name: 'henry'
  },
  {
    age: 'old'
  },
  {
    food: 'matooke'
  },
  {
    kids: 'Acacia'
  }
]

reduce 将像Object.assign 一样工作。它将遍历上面的数组并将每个键/值对添加到累积对象中,该对象在开始时是一个空对象。这就是为什么你会得到:

{ kids: 'Acacia', food: 'matooke', age: 'old', name: 'henry' }

累积对象在开始时是undefined,但由于解构,这无关紧要:

const foo = undefined;
const bar = { a: 'b' };

console.log({...foo, ...bar })

【讨论】:

  • 嗯,我知道理论上@Erazihel。但是积累对象在哪里
  • 不应该作为第二个参数传递给reduce函数吗?
  • @HenryBbosa 我已经更新了我的答案,告诉你为什么第一个积累可以是undefined
  • 哦,它最初是未定义的.. 非常感谢 :)
猜你喜欢
  • 2017-08-28
  • 1970-01-01
  • 1970-01-01
  • 2017-05-17
  • 2016-06-24
  • 2015-05-08
  • 1970-01-01
相关资源
最近更新 更多