如何在不可变对象的函数JavaScript转换中处理if/else进行调试
我把这个放在一个盒子里 使用lodash和一些转换方法将流经Flux Dispatcher的不可变对象处理为JSON,以便于调试,还可以在输出中的键名称前加上“Immutable”来表示。它工作得很好,但我正在学习如何使用u.map、u.compose、u.curry,我想知道这是否可以变得更加实用 具体地说,我想知道如何处理发送到u.map的函数中的if/else:如何在不可变对象的函数JavaScript转换中处理if/else进行调试,javascript,json,functional-programming,lodash,immutable.js,Javascript,Json,Functional Programming,Lodash,Immutable.js,我把这个放在一个盒子里 使用lodash和一些转换方法将流经Flux Dispatcher的不可变对象处理为JSON,以便于调试,还可以在输出中的键名称前加上“Immutable”来表示。它工作得很好,但我正在学习如何使用u.map、u.compose、u.curry,我想知道这是否可以变得更加实用 具体地说,我想知道如何处理发送到u.map的函数中的if/else: var data = { type: 'TEST', active: true, letters: Immutabl
var data = {
type: 'TEST',
active: true,
letters: Immutable.Map({ 'a': true, 'b': false })
};
var dataToLog = _.object(
_.map(data, function(v, k) {
if (Immutable.Iterable.isIterable(v)) {
return ['*Immutable* - ' + k, v.toJS()];
} else {
return [k, v];
}
})
);
console.log('Output: ', dataToLog);
"Output: "
[object Object] {
*Immutable* - letters: [object Object] {
a: true,
b: false
},
active: true,
type: "TEST"
}
我不明白如何将其转换为功能性的东西,而不是检查不可变并将其返回到单独的函数中,这些函数检查对象的不可变值,另一个函数将其转换为JSON(调用Immutable的.toJS())
我也在努力学习如何操作它,并在将其作为对象操作时获得所需的输出,而不是让map函数返回键和值的数组
为了澄清整体转型的目标:
- 使用键、值在对象上迭代
- 若值不是不可变对象,则返回未更改的键和值
- 若value是一个不可变对象,那个么将key修改为前缀为“Immutable”,并对value调用.toJS(),然后返回这些转换
if (Immutable.Iterable.isIterable(v)) {
return ['*Immutable* - ' + k, v.toJS()];
} else {
return [k, v];
}
问题中可能出现的混淆点:
.transform
与.reduce
相比,因为jsbin代码中OP的immutableToJS()
函数有返回语句<代码>转换仅使用返回false
停止迭代下面是代码的更正版本,以满足您的转换目标。您非常熟悉jsbin代码
if (Immutable.Iterable.isIterable(v)) {
return ['*Immutable* - ' + k, v.toJS()];
} else {
return [k, v];
}
问题中可能出现的混淆点:
.transform
与.reduce
相比,因为jsbin代码中OP的immutableToJS()
函数有返回语句<代码>转换仅使用返回false
停止迭代那有什么不“实用”的呢?(有一件事:
if…else
,其中if
子句总是以return
结尾是多余的。您只需要if
和noelse
)为什么你认为如果不起作用?@Pointy:而是使用三元运算符:-)@Bergi当然在这种情况下,这很好我不确定你问题的其余部分,但是对于lodash,你可以使用变换方法<代码>..transform(数据,函数(result,v,k){if(Immutable.Iterable.isIterable(v))返回结果['*Immutable*-'+k]=v.toJS();否则返回结果[k]=v;})代码>这有什么不“功能”的?(有一件事:if…else
,其中if
子句总是以return
结尾是多余的。您只需要if
和noelse
)为什么你认为如果不起作用?@Pointy:而是使用三元运算符:-)@Bergi当然在这种情况下,这很好我不确定你问题的其余部分,但是对于lodash,你可以使用变换方法<代码>..transform(数据,函数(result,v,k){if(Immutable.Iterable.isIterable(v))返回结果['*Immutable*-'+k]=v.toJS();否则返回结果[k]=v;})代码>