Ecmascript 6 如何在Javascript ES6中将switch语句作为函数参数传递?

Ecmascript 6 如何在Javascript ES6中将switch语句作为函数参数传递?,ecmascript-6,redux,Ecmascript 6,Redux,如何在Javascript中将switch语句作为函数参数传递 我想使用Redux库执行此操作: const agendaPointsReducer = function (state = initialState, action) { return Object.assign({}, state, switch (action.type) { case OPEN_AGENDA_POINT: { state.modal_is_open = true, stat

如何在Javascript中将switch语句作为函数参数传递

我想使用Redux库执行此操作:

const agendaPointsReducer = function (state = initialState, action) {
  return Object.assign({}, state, switch (action.type) {
    case OPEN_AGENDA_POINT: {
      state.modal_is_open = true,
      state.point_id = action.id
    }
    case CLOSE_AGENDA_POINT: {
      state.modal_is_open = false
    }
  })
}

但是我得到了一个意外的令牌错误。我知道这在Coffeescript中是可能的,有没有办法在Javascript es6中做到这一点?

switch
语句不是Javascript中的表达式。在Coffeescript中,一切都是一个表达式(一个红宝石)。因此,没有办法做到这一点。此外,在您刚刚展示的示例中,没有理由这样做,因为您的
switch
语句只是在修改已传递的
state
变量。

一种可能性是将其包装成如下函数:

const agendaPointsReducer = function (state = initialState, action) {
  return Object.assign({}, state, (() => {
    switch (action.type) {
      case OPEN_AGENDA_POINT: {
        state.modal_is_open = true,
        state.point_id = action.id
      }
      case CLOSE_AGENDA_POINT: {
        state.modal_is_open = false
      }
    }
  })())
}
const agendaPointsReducer = function (state = initialState, action) {
  switch (action.type) {
    case OPEN_AGENDA_POINT: {
      return {
        ...state,
        modal_is_open: true,
        point_id: action.id
      };
    }
    case CLOSE_AGENDA_POINT: {
      return {
        ...state,
        modal_is_open: false,
      };
    }
  }
}
因此,
Object.assign()
将属性从您传递给目标对象的对象复制到目标对象上。因此,您需要传递的是具有可以从中复制的属性的对象

如果您试图创建的对象具有基于当前执行的switch语句的属性(这是我对您尝试执行的操作的猜测),那么我建议您在调用
object.assign()
并将该对象传递给它之前创建源对象

按照我在这里展示的方式进行操作将避免任何会改变传入对象的副作用(这就是为什么我们在switch语句中对本地对象设置属性,而不是对
状态
对象设置属性):


我想你真正想做的是:

const agendaPointsReducer = function (state = initialState, action) {
  return Object.assign({}, state, (() => {
    switch (action.type) {
      case OPEN_AGENDA_POINT: {
        state.modal_is_open = true,
        state.point_id = action.id
      }
      case CLOSE_AGENDA_POINT: {
        state.modal_is_open = false
      }
    }
  })())
}
const agendaPointsReducer = function (state = initialState, action) {
  switch (action.type) {
    case OPEN_AGENDA_POINT: {
      return {
        ...state,
        modal_is_open: true,
        point_id: action.id
      };
    }
    case CLOSE_AGENDA_POINT: {
      return {
        ...state,
        modal_is_open: false,
      };
    }
  }
}

除了针对您的问题给出的答案之外,我还想为您提供一个更一般的答案

要将
switch
语句传递给函数,需要将其转换为表达式。实现这一点有两种不同的方法

在函数中换行
开关
constapply=f=>x=>f(x);
常量枚举=应用(x=>{
交换机(x.constructor){
案件编号:{
返回公司(x);
}
大小写字符串:{
返回成功(x);
}
默认值:抛出TypeError();
}
});
常数inc=x=>x+1;
const succ=x=>String.fromCharCode(x.charCodeAt(0)+1);
console.log(“枚举1:,枚举(1));//2.

console.log(“枚举a:”,枚举(“a”);//“b”
我认为和给出的答案是最好、最直接的解决方案。但考虑其他选择仍然很有趣:)

在尝试将
开关
逻辑存储在
映射
中时,我得到了一些乐趣。它可能有很多缺点(例如,你不能通过省略一个
中断来链接案例),而且它使事情变得过于复杂,所以我想我们只能把它看作是一种探索,而不是“这是我在实际项目中应该做的”

方法:

  • 为每个
    案例
    创建一个
    映射
    ,其中包含一个条目
  • 每个条目都有
    大小写作为键
  • 每个条目都有一个函数,该函数将所需结果作为值返回
  • 对于未定义的情况,
    Map
    getItem
    返回
    null
    ,我们也将其封装在函数中
代码:

const apply=f=>typeof f==“函数”?f():空;
常量开关=(输入,…条目)=>apply(新映射(条目).get(输入));
常量类型={
增量:“增量”,
减量:“减量”,
广场:“广场”
};
const myNumberReducer=函数(状态={myNumber:0},操作={}){
返回Object.assign({},state,Switch(action.type,
[types.INCREMENT,()=>({myNumber:state.myNumber+1})],
[types.DECREMENT,()=>({myNumber:state.myNumber-1})],
[types.SQUARE,()=>({myNumber:state.myNumber*state.myNumber})]
));
}
设lastState=myNumberReducer();
console.log(lastState);//我的号码:0
lastState=myNumberReducer(lastState,{type:types.INCREMENT});
console.log(lastState);//我的号码:1
lastState=myNumberReducer(lastState,{type:types.INCREMENT});
lastState=myNumberReducer(lastState,{type:types.SQUARE});

console.log(lastState);//myNumber:4
你是什么意思?如何?将副作用作为函数参数传递有什么意义?即使
switch
语句是表达式,示例中的语句也会导致
undefined
无法传递switch语句。你必须把它包装成一个函数。但是,
Object.assign()
希望您向它传递一个包含它将复制的属性的对象。所以,你必须在那里传递一个物体。你的问题现在得到回答了吗?如果是,请选择最佳答案并单击旁边的绿色复选标记,向社区表明您的问题已得到回答。看起来很有趣,将尝试此方法。我认为每个对象之前都需要一个
返回
语句!只使用了原始代码,其中没有给出
break
return
。此外,不需要传递参数
state
,它已经在匿名函数中定义了!嗯,
Object.assign()
需要一个具有属性的对象,属性将被复制。在调用
object.assign()
并传递该对象之前,创建所需的对象会更加清晰。这真的很难遵循代码(如果它能工作的话)。这确实能工作,但在经过一些sytax错误纠正之后。