2016-07-17 6 views
-1

私は私に次のフォーマットの配列を返すデータベースクエリがあります。Sequelizeクエリによって返されたJSオブジェクトのキーの移動と削除?

[ 
    { score: 1, User: { username: 'user111' } }, 
    { score: 2, User: { username: 'user222' } } 
] 

を私は、ユーザー名に各スコアのUser.usernameを移動したいと思います。

残念ながら、なぜわからない、動作するようには思えない
 console.log(JSON.parse(JSON.stringify(scores))); 
     for (var i = 0, len = scores.length; i < len; i++) { 
      scores[i].username = scores[i].User.username; 
      delete scores[i].User; 
     } 
     console.log("------------------"); 
     console.log(JSON.parse(JSON.stringify(scores))); 

:この時につまずくかもしれない人興味のある人のための

code result

+2

ここで動作します:https://jsfiddle.net/7cju75nm/ – bloodyKnuckles

+0

どうしたらいいですか... node.jsには何か関係がありますか? – user1255410

+1

オブジェクトはフリーズしていますか(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze)ですか? – Oriol

答えて

-1

わかりました:

ここで私がやってんですよ私が言ったように、私はSeqelize ORMのデータベース結果として得点を得ていました。これは明らかに、各スコアのために、私はこのトリックをしなければならなかったので、簡単なJavaScriptオブジェクトではありません。

scores[i] = JSON.parse(JSON.stringify(scores[i])); 

編集:クエリから

Sequelizeの返されたオブジェクトも、すべてのモデルの内部情報が含まれています。よりパフォーマンスに優しいアプローチでそれを取り除くには、plain:trueオプション(Sequelize 3.x)でgetを使用します。

const keys = Object.keys(scores[0]).filter(key => key != 'User'); 
scores = scores.map(score => { 
    const res = {}; 
    keys.forEach(key => { 
    res[key] = score[key]; 
    }); 
    res.username = score.User.username; 
    return res; 
}); 

これは、すべてのスコアが同じキーを持っていることを前提としていますが、パフォーマンスは悪くはないする必要があります:私はあなたが新しいオブジェクトに必要なものをコピーするために、あなたをお勧めします

 for (var i = 0, len = scores.length; i < len; i++) { 
      scores[i] = scores[i].get({ plain: true }); 
      scores[i].username = scores[i].User.username; 
      delete scores[i].User; 
     } 
+0

これはひどいパフォーマンスです! – Lux

+0

私のソリューションを変更しました。あなたはSequelizeで動作しませんでした。 – user1255410

-1

:ここに完全なソリューションです。そのO(n*m)ここで、nは配列内の項目の数で、mはコピーしたいキーの数です。

関連する問題