_.map 覆盖 return 上的值

_.map overwriting value upon return

我在使用 lodash _.ma 函数时注意到一些奇怪的行为。 (那个或者我公然忽略了一些东西)

我有以下内容:

_this.searches = _.map(body.rows, function(row) {
    var tmpSearch = new Search(row.value);
    console.log(tmpSearch.search['name']);
    return tmpSearch.search;
});

Search 只是一个带有一些原型函数的标准 javascript 对象。

然而,当我检查 _this.searches 时,每个对象都是相同的,我试图循环遍历它以获得更好的结果:

_.forEach(_this.searches, function(search) {
    console.log(search['name']);
})

_.mapconsole.log 是这样的:

2015-04-03T14:14:29+0800 <log> searches.js:35 () test
2015-04-03T14:14:29+0800 <log> searches.js:35 () Test 2
2015-04-03T14:14:29+0800 <log> searches.js:35 () Testing search

_.forEachconsole.log 是这样的:

2015-04-03T14:14:29+0800 <log> searches.js:42 () Testing search
2015-04-03T14:14:29+0800 <log> searches.js:42 () Testing search
2015-04-03T14:14:29+0800 <log> searches.js:42 () Testing search

Search 可以在这里找到:http://pastebin.com/4y6taGUr 虽然没什么特别的。

那么问题就在:

Search.prototype.search = {};

只要您将 search 属性 放入 Search class 的原型中,它就会在 Search 的所有实例之间共享。因此,此 属性 的每次更改都会影响所有实例。这就是为什么您总是看到最后分配的值。
要修复它 - 将此 属性 放入实例本身,例如在构造函数中:

var Search = function(searchDoc) {
    this.search = {};
    if(!_.isEmpty(searchDoc)) this.setSearch(searchDoc);
};

参见jsbin