修复此测试:Functional-Reactive 编程教程

Fix this test: Functional-Reactive Programming Tutorial

我正在学习 http://reactivex.io/learnrx/ 上的教程。我在 练习 19 - 使用初始值进行归约: 有时当我们归约数组时,我们希望归约后的值与存储在阵列。假设我们有一个视频数组,我们希望将它们缩减为单个映射,其中键是视频 ID,值是视频的标题。

就教程而言,我已经解决了:

function exercise19() {
    var videos = [
        {
            "id": 65432445,
            "title": "The Chamber"
        },
        {
            "id": 675465,
            "title": "Fracture"
        },
        {
            "id": 70111470,
            "title": "Die Hard"
        },
        {
            "id": 654356453,
            "title": "Bad Boys"
        }
    ];

  return videos.reduce(function(accumulatedMap, video) {
      var copyOfAccumulatedMap = Object.create(accumulatedMap);
      copyOfAccumulatedMap[video.id] = video.title; // <-- My solution

      return copyOfAccumulatedMap;
  }, {});
} // end of overall function

要验证您的解决方案,请单击 "Run." 如果它运行正确,那么您可以继续进行下一个练习。我做到了,它给了我下一个练习。我的测试套件告诉我不同​​。

在尝试解决它时,我创建了这个测试:

 it("should be able to reduce to an object with id's for keys", function() {

    var output = [{
      "65432445": "The Chamber",
      "675465": "Fracture",
      "70111470": "Die Hard",
      "654356453": "Bad Boys"
    }];

    expect(exercise19()).toEqual(output);

  }); // end it

(我得到了教程的输出。)

我遇到的问题是测试继续失败:

Expected [ Object({ 654356453: 'Bad Boys' }) ] to equal [ Object({ 65432445: 'The Chamber', 675465: 'Fracture', 70111470: 'Die Hard', 654356453: 'Bad Boys' }) ].

所以它似乎只在测试中选择最后的 属性、'bad boys' 属性。我在想,通过 reduce 的工作方式和 Object.create,其他属性在那里,但它们在原型上。我怎样才能让这个测试通过..?

更新:

我在 pull-request 中修复了这个问题。这些教程没有使用 Object.assign,而是 Object.create。现在可以测试了。 :-)

这看起来像是 Jasmine toEqual 的一个已知问题——它只是忽略了原型中的属性。您可能可以在测试中使用类似的东西:

// ...
expect(exercise19()).toEqual(jasmine.objectContaining({
  "654356453": "Bad Boys"
  // rest data here
}));

Object.create 使用第一个参数中指定的对象原型创建一个新对象 - 你根本没有复制对象,你正在使用对象的原型创建一个新对象 - 即你正在做长篇大论 var copyOfAccumulatedMap = {}

相反,这样做

return videos.reduce(function(accumulatedMap, video) {
    accumulatedMap[video.id] = video.title;
    return accumulatedMap;
}, {});