【问题标题】:Does _.find return a reference to the object? How to properly set a property of the result?_.find 是否返回对对象的引用?如何正确设置结果的属性?
【发布时间】:2016-07-05 23:33:22
【问题描述】:

我使用 lodash find 从数组中查询对象,然后我设置了该对象的属性,但是当我在设置此属性后打印出数组时,它没有改变。

我会感谢在 JavaScript 中使用 lodash 处理对象方面更有经验的人提供的一些 cmets。也可以随意评论我提出问题的方式或编辑内容以使其更容易通过搜索引擎被其他人搜索。

隔离代码:

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 referenceReturns the matched element, else undefined. 我不确定这是否意味着它返回克隆对象或对查询对象的引用。

【问题讨论】:

  • 您需要拨打.value()吗?一堆东​​西被懒惰地评估,直到你这样做才会解决。
  • 请详细点,.value() 在哪个对象上,用它来设置属性值?
  • 我的意思是要获得结果,我认为您需要致电session.value()
  • 您的意思是处理(解决)promise?结果是因为yield关键字解决的,我use strict环境和代码在promise里面。
  • 哦。好吧,这就是我没有仔细阅读的结果。抱歉,继续。

标签: javascript node.js lodash co


【解决方案1】:

正在发生的事情是您产生的值是一个对象,根据co 文档,它会将对象中的每个值视为要解决的承诺,并将返回一个具有相同键的(新)对象和 values 是已解决的 Promise 的值。

在您的情况下,由于属性的值(例如 token)不是承诺,因此值按原样传递,因此返回的对象 看起来 像您的对象产生了,但实际上它是一个新对象,不是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 返回找到的元素本身,而不是它的克隆。

【讨论】:

  • 刚刚测试过,效果很好。非常感谢您,不仅解决方案而且解释清楚,干杯!
猜你喜欢
  • 2018-05-18
  • 1970-01-01
  • 1970-01-01
  • 2020-08-13
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多