我们如何使用Underscore.js将数组与uniq值合并?

时间:2017-09-21 10:51:05

标签: javascript underscore.js

如果我有两个像

这样的数组
a= [{ name: 'a', name: 'b' }] 
b= [c, d, b, e]

我希望结果像

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

但是不想像使用_.map()的第一个数组转换那样反复检查,并且在使用_.union()或其他类型进行合并之后,请检查_.uniq()通过但是如果可能的话我需要全部然后作为短层。

1 个答案:

答案 0 :(得分: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"}]"