【问题标题】:Using pure function with Javascript object使用带有 Javascript 对象的纯函数
【发布时间】:2019-10-22 03:10:09
【问题描述】:

假设我有这样的代码:

function example() {
  const obj = {};
  for (let i = 0; i < 10; i++) {
    for (let j = 0; j< 10; j++) {
       if (obj[i] == undefined) {
         obj[i] = 0;
       }
       if (obj[j] == undefined) {
         obj[j] = 0;
       } else {
         obj[i] += i;
         obj[j] += j;
       }
    }
  }
}

在这里你可以看到:

if (obj[i] == undefined) {
  obj[i] = 0;
}

我检查i 是否不在obj 中我将i 内的obj 分配为0,否则我什么也不做,我用j 做样本。

代码是重复的,我不想重复自己,这是不好的做法,所以我创建另一个函数来申请ij,如下所示:

function initObjWithValue(obj, keys) {
  for (const key of keys) {
    if (obj[key] === undefined) {
      obj[key] = 0;
    }
  }
}

这个功能很容易理解吧?它的第一个参数是对象,第二个参数是要检查的键数组。现在我可以像这样重构我的代码:

function example() {
  const obj = {};
  for (let i = 0; i < 10; i++) {
    for (let j = 0; j< 10; j++) {
       initObjWithValue(obj, [i, j]);
       obj[i] += i;
       obj[j] += j;
    }
  }
}

代码更清晰,但正如您在我的函数initObjWithValue 中看到的那样,它变异了obj,我认为它不好。这是维基页面的引用:

在计算机编程中,纯函数是具有以下属性的函数: 对于相同的参数(本地静态变量、非本地变量、可变引用参数或来自 I/O 设备的输入流没有变化),它的返回值是相同的。

而我就卡在了这一点上,在这种情况下,我怎么能不重复自己,实现纯函数呢?

【问题讨论】:

    标签: javascript purely-functional


    【解决方案1】:

    您可以改为让initObjectWithValue 返回一个新对象,然后您可以将其与当前的obj 合并。这样,您所做的就是从obj 读取,而不是在initObjectWithValue 内对其进行变异:

    function initObjWithValue(obj, keys) {
      const tmp = {};
      for (const key of keys) {
        if (!(key in obj)) {
          tmp[key] = 0;
        }
      }
      return tmp;
    }
    
    function example() {
      const obj = {};
      for (let i = 0; i < 10; i++) {
        for (let j = 0; j< 10; j++) {
           Object.assign(obj, initObjWithValue(obj, [i, j])); // merge the return with current object
           obj[i] += i;
           obj[j] += j;
        }
      }
      return obj;
    }
    
    console.log(example());

    【讨论】:

    • 不错,之前没想过,Object.assign / Spread Object 好像是救命稻草
    【解决方案2】:

    而不是检查

    (obj[i] == undefined)
    

    (typeof obj[i] == undefined)
    

    【讨论】:

    • 你能告诉我你为什么用这个吗?而(typeof obj[i] == undefined) 应该是(typeof obj[i] === 'undefined')
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    • 2019-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多