如何在没有`var`的情况下重写这段代码?

时间:2017-01-19 23:12:04

标签: javascript functional-programming ecmascript-6

我有以下代码根据索引1

处的数组元素的值返回不同的对象



const myArray = Array(1,2,3)
const myOtherArray = Array(1,3,4) 
const myThirdArray = Array(1,5,7)

// Creates object from array and prints it
let toObject = function(x){
  var myObject
  if (x[1] == 2){
     myObject = {first: x[0],
      second: x[1],
      third: x[2]
    }
  }
  else if (x[1] == 3){
     myObject = {first: x[0],
      second: x[1]-1,
      third: x[2]
    }
  }
  else {
     myObject = {first: x[0],
      second: x[1]+1,
      third: x[2]
    }
  }
  
  return myObject
}

console.log(toObject(myThirdArray))




上述实现的问题是我定义myObject并使用赋值语句。我想在一个纯粹功能性的#34;中实现这一点。方式,即避免可变性。在Scala或Haskell中,我想我可以使用模式匹配,但是如何在Javascript中完成此操作?是否可以在不使用var的情况下实现此目的?

4 个答案:

答案 0 :(得分:5)

只需替换" myObject"用"返回"在你的if块中。

只是为了好玩,这是一个完全不可读的方法:

return { first: x[0],
   second: (x[1]+1) - (x[1] == 2) - 2*(x[1] == 3),
   third: x[2]
};

更严重的是,你可以为第二个"一个非常小的函数,并调用该函数。

但你应该编写两个函数:一个用于重命名键,另一个用于将偏移量应用于second

答案 1 :(得分:2)

由于只有差异是第二种,你可以这样做

let toObject = function(x){
  let offset = 1;
  if (x[1] == 2){
      offset = 0;
  }
  else if (x[1] == 3){
      offset = -1;
  }

  return {first: x[0],
      second: x[1] + offset,
      third: x[2]
    }
}

答案 2 :(得分:2)

我建议使用解构赋值来代替函数x参数。结合直截了当的switch,结果函数在可读性和风格方面提供了巨大的改进

const toObject = ([first, second, third]) => {
  switch (second) {
    case 2:
      return { first, second, third }
    case 3:
      return { first, second: second - 1, third }
    default:
      return { first, second: second + 1, third }
  }
}

console.log(toObject([ 1, 2, 3 ]))
// => { first: 1, second: 2, third: 3 }

console.log(toObject([ 1, 3, 4 ]))
// => { first: 1, second: 2, third: 4 }

console.log(toObject([ 1, 5, 7 ]))
// => { first: 1, second: 6, third: 7 }

答案 3 :(得分:1)

你在想这样的事吗?

let toObject = function(x){

  if (x[1] == 2){
     return {first: x[0],
      second: x[1],
      third: x[2]
    };
  }
  else if (x[1] == 3){
     return {first: x[0],
      second: x[1]-1,
      third: x[2]
    };
  }
  else {
     return {first: x[0],
      second: x[1]+1,
      third: x[2]
    };
  }
}