【发布时间】:2015-09-10 05:46:50
【问题描述】:
我遇到了一个在 javascript 中从未见过的问题。这是我正在做的事情的精髓
var doStuff = function(stuff, otherstuff){
return _.map(stuff, function(s){
// Thing needed is a fairly big object
var thingNeeded = _.find(otherstuff, function(os){
return os.whatineed;
});
var new_thing = _.clone(s);
new_thing.new_field = thingNeeded;
return new_thing;
});
};
但这会返回一个列表,它是原始的stuff 列表!如果我这样做,它甚至会发生
var doStuff = function(stuff, otherstuff){
return _.map(stuff, function(s){
// Thing needed is a fairly big object
var thingNeeded = _.find(otherstuff, function(os){
return os.whatineed;
});
s.new_field = thingNeeded;
return s;
});
};
或
var doStuff = function(stuff, otherstuff){
return _.map(stuff, function(s){
// Thing needed is a fairly big object
var thingNeeded = _.find(otherstuff, function(os){
return os.whatineed;
});
s['new_field'] = thingNeeded;
return s;
});
};
或使用_.extend() 和_.create() 的变体。它也不适用于数组原型中的地图。
我不知道我在这里做错了什么。它完全无视我添加该字段。有人可以帮忙吗?
编辑:记录在案
[{thing: 1}, {thing: 2}].map(function(t){
t.welp = 'welp';
});
将按预期返回[{thing: 1, welp: 'welp'}, {thing: 2, welp: 'welp'}]。所以它在地图内的某个地方。
再次编辑:
var doStuff = function(stuff, otherstuff){
return _.map(stuff, function(s){
// Thing needed is a fairly big object
var thingNeeded = _.find(otherstuff, function(os){
return os.whatineed;
});
var new_thing = _.clone(s);
new_thing.new_field = thingNeeded;
console.log('stuff:', new_thing.new_field);
return new_thing;
});
};
console.log 将返回我们期望的值 (thingNeeded)。
谢谢!
【问题讨论】:
-
尝试克隆需要的东西?
-
在最后两种情况下,您将 'os' 传递给 'find' 回调,然后在其中使用'otherstuff'。在第一种情况下,如果 'otherstuff' 上不存在 '.whatineed',那么你将得到你所看到的。
-
@caasjj 感谢您指出错字。
-
@korven 克隆无法解决任何问题。