Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在不可变对象的函数JavaScript转换中处理if/else进行调试_Javascript_Json_Functional Programming_Lodash_Immutable.js - Fatal编程技术网

如何在不可变对象的函数JavaScript转换中处理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

我把这个放在一个盒子里

使用lodash和一些转换方法将流经Flux Dispatcher的不可变对象处理为JSON,以便于调试,还可以在输出中的键名称前加上“Immutable”来表示。它工作得很好,但我正在学习如何使用u.map、u.compose、u.curry,我想知道这是否可以变得更加实用

具体地说,我想知道如何处理发送到u.map的函数中的if/else:

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(),然后返回这些转换

以下是您的代码的正确版本,以满足您的转换目标。您非常熟悉jsbin代码

if (Immutable.Iterable.isIterable(v)) {
  return ['*Immutable* - ' + k, v.toJS()];
} else {
  return [k, v];
}

问题中可能出现的混淆点:

  • .transform
    .reduce
    相比,因为jsbin代码中OP的
    immutableToJS()
    函数有返回语句<代码>转换仅使用
    返回false
    停止迭代
  • 在这一行中,使用“功能性”一词来表示“工作”:“…将其转化为功能性的东西…”。这些评论表明人们把它解读为“函数式编程风格”
  • “处理这个if/else…”的措辞,意思是“修复if/else,因为它不工作”。这些评论表明,人们把这个短语理解为“去掉if/else,用使用函数式编程方法的代码替换它”(由上面的第2点复合而成)
    下面是代码的更正版本,以满足您的转换目标。您非常熟悉jsbin代码

    if (Immutable.Iterable.isIterable(v)) {
      return ['*Immutable* - ' + k, v.toJS()];
    } else {
      return [k, v];
    }
    

    问题中可能出现的混淆点:

  • .transform
    .reduce
    相比,因为jsbin代码中OP的
    immutableToJS()
    函数有返回语句<代码>转换仅使用
    返回false
    停止迭代
  • 在这一行中,使用“功能性”一词来表示“工作”:“…将其转化为功能性的东西…”。这些评论表明人们把它解读为“函数式编程风格”
  • “处理这个if/else…”的措辞,意思是“修复if/else,因为它不工作”。这些评论表明,人们把这个短语理解为“去掉if/else,用使用函数式编程方法的代码替换它”(由上面的第2点复合而成)
    那有什么不“实用”的呢?(有一件事:
    if…else
    ,其中
    if
    子句总是以
    return
    结尾是多余的。您只需要
    if
    和no
    else
    )为什么你认为
    如果
    不起作用?@Pointy:而是使用三元运算符:-)@Bergi当然在这种情况下,这很好我不确定你问题的其余部分,但是对于lodash,你可以使用
    变换
    方法<代码>..transform(数据,函数(result,v,k){if(Immutable.Iterable.isIterable(v))返回结果['*Immutable*-'+k]=v.toJS();否则返回结果[k]=v;})这有什么不“功能”的?(有一件事:
    if…else
    ,其中
    if
    子句总是以
    return
    结尾是多余的。您只需要
    if
    和no
    else
    )为什么你认为
    如果
    不起作用?@Pointy:而是使用三元运算符:-)@Bergi当然在这种情况下,这很好我不确定你问题的其余部分,但是对于lodash,你可以使用
    变换
    方法<代码>..transform(数据,函数(result,v,k){if(Immutable.Iterable.isIterable(v))返回结果['*Immutable*-'+k]=v.toJS();否则返回结果[k]=v;})