2016-03-19 4 views
3

私はlodash findを使用して配列からオブジェクトを問い合わせ、そのオブジェクトのプロパティを設定しますが、このプロパティを設定した後に配列を出力するときは変更されません。_.findはオブジェクトへの参照を返しますか?どのように結果のプロパティを適切に設定するのですか?

JavaScriptでロダッシュでオブジェクトを処理する経験が豊富な人からのコメントに感謝します。また、問題を定式化する方法や、検索エンジンを介して他の人々の検索が容易になるようにコンテンツを編集する方法については自由にコメントすることができます。

孤立コード:

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、fうなぎもここでコメントしてください。 この質問が他の人にも役立つことを願っています。

編集 Lodash referenceReturns the matched element, else undefined.と表示されています。これは、クローンされたオブジェクトまたは照会されたオブジェクトへの参照が返されるかどうかはわかりません。

+0

'.value()'を呼び出す必要がありますか?物事の束は怠惰に評価され、あなたがするまで解消されません。 – Casey

+0

詳しくは '.value()'を参照してください。 – Marek

+0

結果を得るには、 'session.value()'を呼び出す必要があると思います。 – Casey

答えて

2

発生している値は、オブジェクトです。coドキュメントによれば、ドキュメント内の各値は解決される約束として扱われ、同じキーを持つ(新しい)オブジェクトが返されます。値は解決された約束の値です。あなたのケースでは

、(例えば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は、見つかった要素自体を返します。クローンではありません。

+0

ちょうどテストされて、魅力のように動作します。ソリューションだけでなく、明確な説明、歓声にも非常に感謝します! – Marek

関連する問題