在JavaScript中获得两个数组的联合

CFN*_*nja 62 javascript arrays

假设我有一个数组[34, 35, 45, 48, 49]和另一个数组[48, 55].我怎样才能得到一个结果数组[34, 35, 45, 48, 49, 55]

Sal*_*ali 91

随着ES6与套装和splat操作员的到来(在仅在Firefox中工作时,检查兼容性表),您可以编写以下神秘的一个内衬:

var a = [34, 35, 45, 48, 49];
var b = [48, 55];
var union = [...new Set([...a, ...b])];
console.log(union);
Run Code Online (Sandbox Code Playgroud)

关于这一行的一点解释:[...a, ...b]连接两个数组,你也可以使用a.concat(b).new Set()创建一个集合,从而创建你的联盟.最后一个[...x]将它转换回数组.

  • Typescript 一直在抱怨,我用 `Array.from(new Set([...a, ...b]))` 替换了扩展运算符,它起作用了。 (2认同)

ken*_*ytm 44

如果您不需要保留订单,并考虑45"45"保持相同:

function union_arrays (x, y) {
  var obj = {};
  for (var i = x.length-1; i >= 0; -- i)
     obj[x[i]] = x[i];
  for (var i = y.length-1; i >= 0; -- i)
     obj[y[i]] = y[i];
  var res = []
  for (var k in obj) {
    if (obj.hasOwnProperty(k))  // <-- optional
      res.push(obj[k]);
  }
  return res;
}

console.log(union_arrays([34,35,45,48,49], [44,55]));
Run Code Online (Sandbox Code Playgroud)

  • 这对于对象数组将失败.union_arrays([{a:1}],[{b:2}])将返回[{b:2}]. (2认同)

Cod*_*ler 43

如果您使用库下划线,您可以这样写

var unionArr = _.union([34,35,45,48,49], [48,55]);
console.log(unionArr);
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.1/underscore-min.js"></script>
Run Code Online (Sandbox Code Playgroud)

参考:http://underscorejs.org/#union

  • Lodash也有[很好的工会实施](https://lodash.com/docs/4.17.4#union) (3认同)
  • 我通常不会为一小段功能引用一个全新的库,但下划线库有很多非常有用的函数来处理数组.我最终也使用了_.intersection和_.without函数. (2认同)

Gar*_*ton 16

我可能在这里浪费时间在一个死线上.我只需要实现这一点,然后去看看我是否在浪费时间.

我真的很喜欢KennyTM的回答.这就是我如何解决这个问题.将密钥合并到散列中以自然地消除重复,然后提取密钥.如果你真的有jQuery,你可以利用它的好东西使这成为一个2行问题,然后将其转换为扩展.jQuery中的each()将负责不迭代hasOwnProperty()为false的项目.

jQuery.fn.extend({
    union: function(array1, array2) {
        var hash = {}, union = [];
        $.each($.merge($.merge([], array1), array2), function (index, value) { hash[value] = value; });
        $.each(hash, function (key, value) { union.push(key); } );
        return union;
    }
});
Run Code Online (Sandbox Code Playgroud)

请注意,两个原始数组都保持不变.然后你这样称呼它:

var union = $.union(array1, array2);
Run Code Online (Sandbox Code Playgroud)

  • O(n)== O(2n)== O(3n) (3认同)

Bob*_*Bob 9

function unique(arrayName)
{
  var newArray=new Array();
  label: for(var i=0; i<arrayName.length;i++ )
  {  
    for(var j=0; j<newArray.length;j++ )
    {
      if(newArray[j]==arrayName[i]) 
        continue label;
    }
    newArray[newArray.length] = arrayName[i];
  }
  return newArray;
}

var arr1 = new Array(0,2,4,4,4,4,4,5,5,6,6,6,7,7,8,9,5,1,2,3,0);
var arr2= new Array(3,5,8,1,2,32,1,2,1,2,4,7,8,9,1,2,1,2,3,4,5);
var union = unique(arr1.concat(arr2));
console.log(union);
Run Code Online (Sandbox Code Playgroud)

  • 我很困惑这怎么行不通? (2认同)

Ada*_*Fox 7

改编自:https://stackoverflow.com/a/4026828/1830259

Array.prototype.union = function(a) 
{
    var r = this.slice(0);
    a.forEach(function(i) { if (r.indexOf(i) < 0) r.push(i); });
    return r;
};

Array.prototype.diff = function(a)
{
    return this.filter(function(i) {return a.indexOf(i) < 0;});
};

var s1 = [1, 2, 3, 4];
var s2 = [3, 4, 5, 6];

console.log("s1: " + s1);
console.log("s2: " + s2);
console.log("s1.union(s2): " + s1.union(s2));
console.log("s2.union(s1): " + s2.union(s1));
console.log("s1.diff(s2): " + s1.diff(s2));
console.log("s2.diff(s1): " + s2.diff(s1));

// Output:
// s1: 1,2,3,4
// s2: 3,4,5,6
// s1.union(s2): 1,2,3,4,5,6
// s2.union(s1): 3,4,5,6,1,2
// s1.diff(s2): 1,2
// s2.diff(s1): 5,6 
Run Code Online (Sandbox Code Playgroud)


小智 7

如果你想连接两个没有任何重复值的数组,试试这个

var a=[34, 35, 45, 48, 49];
var b=[48, 55];
var c=a.concat(b).sort();
var res=c.filter((value,pos) => {return c.indexOf(value) == pos;} );
Run Code Online (Sandbox Code Playgroud)

  • 好的!或者如果您已经在方法链接中(您没有对 c 的引用),则可以使用变体: ``` [1,2,3].concat([2,3,4]) .filter((value, pos, arr)=&gt;arr.indexOf(value)===pos)}``` (2认同)

War*_*rbo 6

我喜欢Peter Ajtai的独特解决方案,但代码不是很清楚.这是一个更好的选择:

function unique(x) {
  return x.filter(function(elem, index) { return x.indexOf(elem) === index; });
};
function union(x, y) {
  return unique(x.concat(y));
};
Run Code Online (Sandbox Code Playgroud)

由于的indexOf返回的指数首次出现时,我们检查这对当前元素的索引(第二个参数过滤谓词).