我有以下代码根据索引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
的情况下实现此目的?
答案 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]
};
}
}