4

lodashfindを使用して配列からオブジェクトをクエリし、そのオブジェクトのプロパティを設定しますが、このプロパティを設定した後に配列を出力すると、変更されません。

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'
} ]

Public Gist、ここにもコメントしてください。この質問が他の人にも役立つことを願っています。

Edit Lodash referenceReturns the matched element, else undefined.は、それがクローンされたオブジェクトまたはクエリされたオブジェクトへの参照を返すことを意味するかどうかわからないと言っています。

4

1 に答える 1

3

何が起こっているかというと、生成している値はオブジェクトであり、coドキュメントによれば、オブジェクト内の各値を解決される約束として扱い、同じキーと値を持つ (新しい) オブジェクトを返します。解決された約束。

あなたの場合、プロパティの値( などtoken)はプロミスではないため、値はそのまま渡されるため、返されるオブジェクトは生成したオブジェクトのように見えますが、実際には内部のオブジェクトではなく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そのクローンではなく、見つかった要素自体を返します。

于 2016-03-19T06:57:50.380 に答える