Javascript 使用下划线.JS合并两个集合

Javascript 使用下划线.JS合并两个集合,javascript,underscore.js,Javascript,Underscore.js,如果我有两个收藏: c1-[{a:1},{a:2},{a:3}] 及 c2-[{a:1},{a:7},{a:8}] 使用underline.JS将唯一项从c2添加到c1的最快方法是什么?集合中的实数对于c1为2K,对于c2为500,操作经常执行,因此必须执行 更新1-我只使用了下划线.JS几天,我找不到一种方法将一个集合添加到另一个集合中(我自己可以过滤c2)-在下划线.JS中这是一件小事吗?因为两个对象中都有大量的属性,而且该算法经常运行,最好使用核心Javascript而不是任何库: //a

如果我有两个收藏:

c1-
[{a:1},{a:2},{a:3}]

c2-
[{a:1},{a:7},{a:8}]

使用
underline.JS
将唯一项从
c2
添加到
c1
的最快方法是什么?集合中的实数对于
c1
2K
,对于
c2
500
,操作经常执行,因此必须执行


更新1-我只使用了
下划线.JS
几天,我找不到一种方法将一个集合添加到另一个集合中(我自己可以过滤
c2
)-在
下划线.JS
中这是一件小事吗?

因为两个对象中都有大量的属性,而且该算法经常运行,最好使用核心Javascript而不是任何库:

//adds all new properties from the src to dst. If the property already exists, updates the number in dst. dst and src are objects
function extendNumberSet( dst, src ) {
    var allVals = [];
    for ( var i = 0; i < dst.length; i++ ) {
        allVals.push(dst[i].a);
    }
    for ( var i = 0; i < src.length; i++ ) {
        if ( allVals.indexOf( src[i].a ) === -1 ) {
            dst.push( src[i] );
        }
    }
}
//将所有新属性从src添加到dst。如果属性已存在,则更新dst中的编号。dst和src是对象
函数extendNumber集(dst、src){
var-allVals=[];
对于(变量i=0;i
以下是。

以下内容:

  • 创建一个包含c1和c2所有元素的新数组。看
  • 从这个组合中,创建一个只包含唯一元素的新数组。看
请注意,只有当所有对象都具有属性
a
时,这才有效

_.uniq(_.union(c1, c2), false, function(item, key, a){ return item.a; });

您可以在。

uniq()的文档中找到其他选项。
函数提到,如果对列表进行排序,它的运行速度会快得多。此外,使用链式调用还可以提高可读性。因此,您可以:

_.chain(c1).union(c2).sortBy("a").uniq(true, function(item){ return item.a; }).value();
或者,如果您更喜欢未加标记的版本(短11个字符,但可读性较差):

uniq()
的文档和示例没有明确说明回调函数是如何工作的。
uniq()
函数的算法对两个列表中的每个元素调用此函数。如果此函数的结果相同,它将删除该元素(假定它是重复的)

union()。我们也可以利用这一事实:

_.map(_.union(_.pluck(c1,"a"),_.pluck(c2,"a")),function (item) {return {a:item};});
上面的like首先将对象列表转换为简单数组(
pluck()
),然后使用
union()
组合它们,最后使用
map()
创建对象列表

参考资料:

试试:

_.uniq(_.union(c1, c2), false, _.property('a'))
详细内容:

  • \uu.union(*数组)

    计算传入数组的并集

  • \属性(键)
    (自1.6.0版起)

    返回一个函数,该函数本身将返回任何传入对象的key属性

  • uniq(数组,[isSorted],[iteratee])

    使用
    ==
    测试对象相等性,生成阵列的重复免费版本。如果您事先知道数组已排序,那么为isSorted传递
    true
    将运行更快的算法。如果要基于转换计算唯一项,请传递一个iteratee函数


  • 两个数组中的元素都是根据
    a
    的值排序的吗?@AlexStack不幸的是,不是,但我知道你是从哪里来的。好的,在不将回调传递给uniq的情况下,将使用===对对象进行比较。({a:1}==={a:1}将为false)。听起来,我只是忽略了“return item.a;”,这正是我需要的。
    _.uniq(_.union(c1, c2), false, _.property('a'))