我正在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
要验证您的解决方案,请点击“运行”。如果它正确运行,那么你可以继续下一个练习。我做了,它给了我下一个练习。我的测试套件以不同的方式告诉我。
在尝试解决问题时,我创建了这个测试:
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
(我从教程中得到了输出。)
我遇到的问题是测试仍然失败:
预期[对象({654356453:'Bad Boys'})]等于[Object({ 65432445:'The Chamber',675465:'Fracture',70111470:'Die Hard', 654356453:'坏男孩'})]。
所以看起来它只是在测试中选择了最后一个属性,即'坏男孩'属性。我认为,通过减少工作和Object.create的方式,其他属性在那里,但它们在原型上。我怎样才能通过这个测试..?
我在拉请求中解决了这个问题。这些教程没有使用Object.assign,而是使用Object.create。它现在可以测试了。 : - )
答案 0 :(得分:1)
它似乎是Jasmine toEqual
的已知问题 - 它只是忽略原型中的属性。你可能可以在测试中使用类似的东西:
// ...
expect(exercise19()).toEqual(jasmine.objectContaining({
"654356453": "Bad Boys"
// rest data here
}));
答案 1 :(得分:0)
Object.create
使用第一个参数中指定的对象的原型创建一个新对象 - 你根本没有复制对象,你正在用Object的原型创建一个新对象 - 即你做了很长时间winded var copyOfAccumulatedMap = {}
相反,这样做
return videos.reduce(function(accumulatedMap, video) {
accumulatedMap[video.id] = video.title;
return accumulatedMap;
}, {});