javascript - 如何在不可变对象(immutable对象)的函数式 JavaScript 转换中处理 if/else 以进行调试

标签 javascript json functional-programming lodash immutable.js

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"
}

我在JSBin here中有这个.

使用 lodash 和一些转换方法将流经 Flux Dispatcher 的不可变对象(immutable对象)操作为 JSON,以便于调试,并通过在输出中的键名称前面添加“Immutable”来进行指示。它运行良好,但我正在学习如何使用 _.map、_.compose、_.curry,并且想知道是否可以使其更加实用。

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

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

我不明白如何将其转换为功能性的东西,除了检查 Immutable 并将其返回到单独的函数中,这些函数检查对象的 Immutable 值,另一个函数将其转换为 JSON(调用Immutable 的 .toJS())。

我还在努力解决如何对其进行操作并在将其作为对象进行操作时获得所需的输出,而不是让我的 map 函数返回键和值的数组。

澄清一下整体转型的目标:

  • 使用键、值迭代对象
  • 如果 value 不是 Immutable 对象,则返回不改变的键和值
  • 如果值是不可变对象(immutable对象),请将键修改为以“不可变”为前缀,并对值调用 .toJS() 并返回这些转换

最佳答案

这是代码的更正版本,可满足您的转换目标。您非常接近 jsbin 代码。

(function (_) {
  "use strict";

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

  var data = {        
        type: 'TEST',
        active: true,
        letters: Immutable.Map({ 'a': true, 'b': false })
      },
      answer = _.transform(data, immutableToJS),
      expectedAnswer = {type: 'TEST', active: true};
  expectedAnswer["*Immutable* - letters"] = {a:true,b:false};

  console.log('answer: ' + JSON.stringify(answer));
  //console.log('expectedAnswer: ' + JSON.stringify(expectedAnswer));
  //console.log(_.isEqual(answer,expectedAnswer));//true
}(_));

http://jsbin.com/somona/edit?js,console

问题中可能存在的混淆点:

  1. _.transform_.reduce 因为 jsbin 代码中 OP 的 immutableToJS() 函数有 return 语句。 _.transform 仅使用 return false; 来停止迭代。
  2. 在这行中使用“功能性”一词来表示“工作”:“...将其转化为功能性的东西...”。这些评论表明人们将其视为“函数式编程风格”。
  3. 措辞“... 处理此 if/else ...”,其含义是“修复 if/else,因为它不起作用”。这些评论表明,人们将这句话读作“去掉 if/else,并将其替换为使用函数式编程方法的代码”(由上面的第 2 点复合)。

关于javascript - 如何在不可变对象(immutable对象)的函数式 JavaScript 转换中处理 if/else 以进行调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31629564/

相关文章:

javascript - Angular,获取 ViewContainerRef 中动态创建的组件的索引

javascript - 为什么我的 Spark 没有动画?

javascript - react : cannot access mixin function inside getDefaultProps

f# - 是否有将一系列管道转换为功能组合的分步过程?

java - 使用 Java 8 谓词改进代码 - 比较多个参数

javascript - GitHub copilot 自动补全 仅一行快捷键

json - 在 post 请求正文中的 Json 对象中发送用户名和密码是否安全?

javascript - 将 Json 解析为状态

javascript - 使用 JSON.stringify 将对象转换为字符串 显示空对象

algorithm - 这个改组算法有什么问题,我怎么知道?