_.find 是否返回对对象的引用?如何正确设置结果的属性
Does _.find return a reference to the object? How to properly set a property of the result?
我使用 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'
} ]
公共要点,请随时在此处发表评论。我希望这个问题对其他人也有用。
编辑Lodash 引用说Returns the matched element, else undefined.
我不确定这是否意味着它返回克隆对象或对查询对象的引用。
正在发生的事情是,您生成的值是一个对象,根据co
文档,它将对象中的每个值视为要解析的承诺,并将返回一个(新)对象,其键和值与解析的承诺的值相同。
在您的情况下,由于属性的值(例如 token
)不是 promises,因此这些值按原样传递,因此返回的对象看起来像您生成的对象,但实际上它是一个新对象,而不是 realtime
中的对象。co
中创建此新对象的代码如下所示:
if (isObject(obj)) return objectToPromise.call(this, obj);
为了防止这种情况发生,您需要这样做
let session = yield Promise.resolve(_.find(realtime, data => data.token === token));
如果你产生了一个标量值,co
会抱怨这不是一个可产生值。但是,由于您生成了对象值,因此co
将其解释为可生成的对象类型。这就提出了一个问题——你为什么要首先试图产生一个不可屈服的?
最后要说明:
Lodash 引用 说 返回匹配的元素,否则未定义。我不确定这是否意味着它返回克隆对象或对查询对象的引用。
当然,_.find
返回找到的元素本身,而不是它的克隆。
- 如何在页面中正确设置AngularJS控件
- 在 AJAX 调用的 zend 控制器操作中正确设置会话
- 如何在此脚本代码中正确设置此计算和变量
- 如何使用JavaScript函数在HTML页面中正确设置背景图像
- Dojo表单.选择未正确设置值
- 无法在javascript中正确设置值
- 如何正确设置 JavaScript 命名空间和类
- 如何在ExtJS 5中正确设置关联并按需加载
- 如何正确设置jQuery日历小部件的区域设置
- HTML5 video.currentTime 未正确设置
- 如何正确设置节点,快速和角度2
- _.find 是否返回对对象的引用?如何正确设置结果的属性
- 如何正确设置原型
- 如何正确设置AngularJS文件
- 如何使用javaScript正确设置文本字段的值
- 正确设置要求.js
- mailto:未在 GroupWise 8 消息中正确设置字段
- Javascript worker 对象未正确设置标志
- 如何避免在为 dijit/form/TextBox 正确设置值时触发事件“更改”
- 如何正确设置范围输入元素的动画