我使用lodash find
从数组中查询对象,然后设置该对象的属性,但是当我在设置此属性后打印出数组时,它没有改变。
对于在JavaScript中使用lodash处理对象更有经验的人的一些评论,我将不胜感激。我也可以自由评论我制定问题的方式或编辑内容,以便通过搜索引擎更容易地搜索其他人。
隔离代码:
console.log('socket.io', token);
console.log(realtime);
let session = yield _.find(realtime, function(data) {
return data.token === token;
});
console.log('session object to be set');
console.log(session);
if (!session.socket) {
console.log('setting session for '+session.token+' socket '+socket.id);
session.socket = socket.id;
console.log('local reference after set');
console.log(session);
console.log('realtime after set');
console.log(realtime);
}
结果,这是console.log
的输出:
socket.io 268fc477-d4ee-4ed4-88cd-648539397df2
[ { token: '268fc477-d4ee-4ed4-88cd-648539397df2' } ]
session object to be set
{ token: '268fc477-d4ee-4ed4-88cd-648539397df2' }
setting session for 268fc477-d4ee-4ed4-88cd-648539397df2 socket /#iEqqcIsBbATDs1a-AAAB
local reference after set
{ token: '268fc477-d4ee-4ed4-88cd-648539397df2',
socket: '/#iEqqcIsBbATDs1a-AAAB' }
realtime after set
[ { token: '268fc477-d4ee-4ed4-88cd-648539397df2' } ]
预期的结果,看看最后一个打印,我希望在对象源于的数据结构中修改此对象:
socket.io 268fc477-d4ee-4ed4-88cd-648539397df2
[ { token: '268fc477-d4ee-4ed4-88cd-648539397df2' } ]
session object to be set
{ token: '268fc477-d4ee-4ed4-88cd-648539397df2' }
setting session for 268fc477-d4ee-4ed4-88cd-648539397df2 socket /#iEqqcIsBbATDs1a-AAAB
local reference after set
{ token: '268fc477-d4ee-4ed4-88cd-648539397df2',
socket: '/#iEqqcIsBbATDs1a-AAAB' }
realtime after set
[ {
token: '268fc477-d4ee-4ed4-88cd-648539397df2',
socket: '/#iEqqcIsBbATDs1a-AAAB'
} ]
公开gist,请随时在这里发表评论。 我希望这个问题对其他人也有用。
编辑
Lodash reference说Returns the matched element, else undefined.
我不确定这是否意味着它返回克隆对象或对查询对象的引用。
答案 0 :(得分:3)
正在发生的是,您正在产生的值是一个对象,根据co
文档,它将对象中的每个值视为要解析的承诺,并将返回一个(新)对象相同的键和值是已解决的承诺的值。
在您的情况下,由于属性的值(例如token
)不是promises,因此值按原样传递,因此返回的对象看起来像你屈服了一个,但实际上它是一个新对象,不是 realtime
内的那个。创建此新对象的co
内的代码为here:
if (isObject(obj)) return objectToPromise.call(this, obj);
为防止这种情况发生,您需要执行
let session = yield Promise.resolve(_.find(realtime, data => data.token === token));
如果您产生了单个标量值,co
会抱怨这不是一个可屈服的。但是,由于您生成了一个对象值,co
将其解释为对象类型可屈服。这引发了这个问题 - 你为什么要首先屈服于非屈服?
最后一点:
Lodash参考说明返回匹配的元素,否则未定义。我不确定这是否意味着它返回克隆对象或对查询对象的引用。
当然,_.find
会返回找到的元素本身,而不是它的克隆。