2017-09-21 5 views
0

私は結果がUnderscore.jsを使用してuniq値で配列をマージする方法はありますか?

[ 
    { 'name': 'a' }, 
    { 'name': 'b' }, 
    { 'name': 'c' }, 
    { 'name': 'd' }, 
    { 'name': 'e' } 
] 

のようになりたい。しかし、繰り返し_.map()を使用して、マージ後_.union()またはその他を使用して変換する最初の配列のようにチェックしたくない2つの配列

a= [{ name: 'a', name: 'b' }] 
b= [c, d, b, e] 

のようにしている場合タイプを入力してから _.uniq()をチェックしますが、可能であればすべてを必要とし、次に短いレイヤーを作成します。

+1

同一のキーで有効なデータを追加してください。 –

+0

いいえ、私はそれのようなデータを持っていて、私はフォーマットで欲しいものをマージする必要があります。 – VjyV

+2

できません。試しても、2つのプロパティではなく、最後の値が得られます。 –

答えて

0

Backbone.Collectionでこれを行うには、model parse functionを活用し、インスタンス化時にparse: trueオプションを指定します。 model idAttributeを指定すると、重複したモデルは回避されます。注:ここでは、タイプチェックと配列マージのためにlodashを使用しました。

var a = [{name: 'a'}, {name: 'b'}]; 
var b = ['c', 'd', 'b', 'e']; 
var Coll = Backbone.Collection.extend({ 
    model: Backbone.Model.extend({ 
    idAttribute: 'name', 
    parse: function(resp, opts) { 
     var modelData = resp; 
     if (_.isString(resp)) { 
     modelData = { name: resp }; 
     } 
     return modelData; 
    } 
    }) 
}); 
// then on initialize 
var data = _.union(a, b); 
var coll = new Coll(data, {parse: true}); 
console.log(JSON.stringify(coll.toJSON())); 
// yields 
"[{"name":"a"},{"name":"b"},{"name":"c"},{"name":"d"},{"name":"e"}]" 

// alternatively, you can choose not merge the data to start 
// and instead either pass some at initialize and then 
// some with a coll.set later, or all with set 
// Note: set call still needs parse:true as well as remove:false 
var coll = new Coll(a, {parse: true}); 
coll.set(b, {parse: true, remove: false}); 
console.log(JSON.stringify(coll.toJSON())); 
// yields 
"[{"name":"a"},{"name":"b"},{"name":"c"},{"name":"d"},{"name":"e"}]" 
関連する問題